浅谈在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触发radio或checkbox的change事件
Dec 18 Javascript
js中复制行和删除行的操作实例
Jun 25 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
Jul 09 Javascript
css+js实现部分区域高亮可编辑遮罩层
Mar 04 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
jquery单选框radio绑定click事件实现方法
Jan 14 Javascript
ES6新特征数字、数组、字符串
Oct 01 Javascript
Javascript的this用法
Jan 16 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
Mar 29 Javascript
使用JS组件实现带ToolTip验证框的实例代码
Aug 23 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
vue element自定义表单验证请求后端接口验证
Dec 11 Javascript
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 yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
iview实现图片上传功能
2020/06/29 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
python和C语言混合编程实例
2014/06/04 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
Python魔法方法详解
2019/02/13 Python
Python中遍历列表的方法总结
2019/06/27 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
Python连接mysql方法及常用参数
2020/09/01 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
投标担保书范文
2014/04/02 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS