浅谈在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 相关文章推荐
IE中jquery.form中ajax提交没反应解决方法分享
Sep 11 Javascript
网站404页面3秒后跳到首页的实例代码
Aug 16 Javascript
JS获取select-option-text_value的方法
Dec 26 Javascript
jQuery.prop() 使用详解
Jul 19 Javascript
javascript数组常用方法汇总
Sep 10 Javascript
微信开发 微信授权详解
Oct 21 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
angularjs实现时间轴效果的示例代码
Nov 29 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
最适应的vue.js的form提交涉及多种插件【推荐】
Aug 27 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 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的开合式多级菜单程序
2006/10/09 PHP
PHP array 的加法操作代码
2010/07/24 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
jQuery中eq()方法用法实例
2015/01/05 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
Python中的模块和包概念介绍
2015/04/13 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python3标准库总结
2019/02/19 Python
详解Python正则表达式re模块
2019/03/19 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
机械个人求职信范文
2014/01/24 职场文书
适用于所有创业者的创业计划书
2014/02/05 职场文书
小学二年级学生评语
2014/04/21 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
工会文体活动总结
2015/05/07 职场文书
Python打包为exe详细教程
2021/05/18 Python