浅谈在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 相关文章推荐
js中判断文本框是否为空的两种方法
Jul 31 Javascript
选择器中含有空格在使用示例及注意事项
Jul 31 Javascript
javascript屏蔽右键代码
May 15 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
js实现异步循环实现代码
Feb 16 Javascript
javascript每日必学之多态
Feb 23 Javascript
JavaScript实现垂直滚动条效果
Jan 18 Javascript
JavaScript canvas实现围绕旋转动画
Nov 18 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
详解js的作用域、预解析机制
Feb 05 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
Apr 09 Javascript
vue 项目build错误异常的解决方法
Apr 22 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
用cookies来跟踪识别用户
2006/10/09 PHP
建立动态的WML站点(一)
2006/10/09 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python基于多线程实现ping扫描功能示例
2018/07/23 Python
解析python的局部变量和全局变量
2019/08/15 Python
python库matplotlib绘制坐标图
2019/10/18 Python
python实现批量文件重命名
2019/10/31 Python
谈谈python垃圾回收机制
2020/09/27 Python
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
经典c++面试题六
2012/01/18 面试题
C#可否对内存进行直接的操作
2015/02/26 面试题
高中生学习的自我评价
2013/12/14 职场文书
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
计划生育宣传标语
2014/06/21 职场文书
2016公司年会主持词
2015/07/01 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android
无线电通信名词解释
2022/02/18 无线电
浅谈Python中对象是如何被调用的
2022/04/06 Python