浅谈在koa2中实现页面渲染的全局数据


Posted in Javascript onOctober 09, 2017

最近用koa2做一个项目的web端,遇到一个场景。

该项目主要用的是传统的服务端渲染的方式,所以会用 koa-views 去做页面的渲染工作。实现方式就是 ctx.render('path',data),那么,有如下场景,每个页面都需要去验证是否登录,登录了要返回页面个人数据,这个情况,怎么办呢?我不想每次都去手动的加入个人数据啊。例如这样:

let data = {
      "user":"12",
      "questionList":questionList
    };
    await ctx.render("index",data);

此处的user就是每个页面都是要返回的数据。

很显然,每个页面都要获得的数据,用中间件去获取,类似java的拦截器,过滤器之类的了。

import {UserClient} from "../manager/user/UserClient";
export const signInStatusMiddleware = async (ctx:any,next:any)=>{
  console.log("signInStatusMiddleware")
  let accessToken = ctx.cookies.get("ACCESS-TOKEN");
  if(accessToken){
    let userClient :UserClient = new UserClient;
    let user = await userClient.getUserByToken(accessToken);
  }
  await next();
}

OK,中间件中已经拿到了用户数据了,那么,问题来了。数据是可以拿,怎么放呢?

找到koa-views 源码。有如下代码:

return function views(ctx, next) {
  if (ctx.render) return next()

  ctx.render = function(relPath, locals = {}) {
   return getPaths(path, relPath, extension).then(paths => {
    const suffix = paths.ext
    const state = Object.assign(locals, options, ctx.state || {})
    // deep copy partials
    state.partials = Object.assign({}, options.partials || {})
    debug('render `%s` with %j', paths.rel, state)
    ctx.type = 'text/html'

    if (isHtml(suffix) && !map) {
     return send(ctx, paths.rel, {
      root: path
     })
    } else {
     const engineName = map && map[suffix] ? map[suffix] : suffix

     const render = engineSource[engineName]

     if (!engineName || !render)
      return Promise.reject(
       new Error(`Engine not found for the ".${suffix}" file extension`)
      )

     return render(resolve(path, paths.rel), state).then(html => {
      ctx.body = html
     })
    }
   })
  }

  return next()
 }

关键是这一段

const state = Object.assign(locals, options, ctx.state || {})

很显然,state 是将传入的数据,合并了,中间件配置的options ,和ctx.state的。中间件显式配置显然部合适,所以,做法是,在拦截器中间件中,把user赋值给ctx.state.

export const signInStatusMiddleware = async (ctx:any,next:any)=>{
  console.log("signInStatusMiddleware")
  let accessToken = ctx.cookies.get("ACCESS-TOKEN");
  if(accessToken){
    let userClient :UserClient = new UserClient;
    let user = await userClient.getUserByToken(accessToken);
    ctx.state = Object.assign(ctx.state,{"user":user});
  }
  await next();
}

ok。这样一来,在页面渲染的时候,就会带上用户信息了。而不需要再在各处去自己手动添加。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery text,radio,checkbox,select操作实现代码
Jul 09 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
举例讲解Node.js中的Writable对象
Jul 29 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
Jun 20 Javascript
JavaScript中关于class的调用方法
Nov 28 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 Javascript
vue数据操作之点击事件实现num加减功能示例
Jan 19 Javascript
jquery无缝图片轮播组件封装
Nov 25 jQuery
10种JavaScript最常见的错误(小结)
Jun 21 Javascript
vue中get请求如何传递数组参数的方法示例
Nov 08 Javascript
解决vue项目 build之后资源文件找不到的问题
Sep 12 Javascript
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
jQuery实现html双向绑定功能示例
Oct 09 #jQuery
jqueryUI tab标签页代码分享
Oct 09 #jQuery
ES6学习教程之模板字符串详解
Oct 09 #Javascript
ES6学习教程之块级作用域详解
Oct 09 #Javascript
JavaScript实现短信倒计时60s
Oct 09 #Javascript
ES6学习教程之对象字面量详解
Oct 09 #Javascript
AngularJS中的路由使用及实现代码
Oct 09 #Javascript
You might like
PHP实现图片压缩
2020/09/09 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
python开发入门——列表生成式
2020/09/03 Python
Django xadmin安装及使用详解
2020/10/26 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
node中使用shell脚本的方法步骤
2021/03/23 Javascript
和平主题的演讲稿
2014/01/12 职场文书
七一党建活动方案
2014/01/28 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
家长会后的感想
2015/08/11 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
听课评课活动心得体会
2016/01/15 职场文书
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python