浅谈在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 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
Jquery 获得服务器控件值的方法小结
May 11 Javascript
IE下使用cloneNode注意事项分享
Nov 22 Javascript
jQuery实现单行文字间歇向上滚动源代码
Jun 02 Javascript
PHP+mysql+Highcharts生成饼状图
May 04 Javascript
基于jQuery实现响应式圆形图片轮播特效
Nov 25 Javascript
AngularJs  Understanding Angular Templates
Sep 02 Javascript
Vue.js父与子组件之间传参示例
Feb 28 Javascript
jquery拖动改变div大小
Jul 04 jQuery
在Create React App中启用Sass和Less的方法示例
Jan 16 Javascript
java实现单链表增删改查的实例代码详解
Aug 30 Javascript
JS使用H5实现图片预览功能
Sep 30 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
escape unescape的php下的实现方法
2007/04/27 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
PHP安全下载文件的方法
2016/04/07 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
详解小程序横屏方案对比
2020/06/28 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
2018/02/13 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
Python Json数据文件操作原理解析
2020/05/09 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
乡镇挂职心得体会
2014/09/04 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
python中urllib包的网络请求教程
2022/04/19 Python