浅谈在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 Animation实现CSS3动画示例介绍
Aug 14 Javascript
JavaScript声明变量时为什么要加var关键字
Sep 29 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
浅谈JavaScript中null和undefined
Jul 09 Javascript
jquery拖拽排序简单实现方法(效果增强版)
Feb 16 Javascript
AngularJs Scope详解及示例代码
Sep 01 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 Javascript
AngularJS ui-router (嵌套路由)实例
Mar 10 Javascript
微信小程序实现单选功能
Oct 30 Javascript
node.js express捕获全局异常的三种方法实例分析
Dec 27 Javascript
django简单的前后端分离的数据传输实例 axios
May 18 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
Sep 01 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快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
Javascript 中的类和闭包
2010/01/08 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
纯JS实现轮播图
2017/02/22 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
python使用cPickle模块序列化实例
2014/09/25 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python常用模块sys,os,time,random功能与用法实例分析
2020/01/07 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
Python通过len函数返回对象长度
2020/10/22 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
《鱼游到了纸上》教学反思
2014/02/20 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
升职自荐信怎么写
2015/03/05 职场文书
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js