浅谈在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 相关文章推荐
显示、隐藏密码
Jul 01 Javascript
基于Jquery的开发个代阴影的对话框效果代码
Jul 28 Javascript
js判断元素是否隐藏的方法
Jun 09 Javascript
js实现checkbox全选、不选与反选的方法
Feb 09 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
May 11 Javascript
jQuery学习笔记之回调函数
Aug 15 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 Javascript
深入理解Vue2.x的虚拟DOM diff原理
Sep 27 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
Nov 06 Javascript
JavaScript显式数据类型转换详解
Mar 18 Javascript
微信小程序的线程架构【推荐】
May 14 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
Nov 04 jQuery
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中比较时间大小实例
2014/08/21 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
vue中appear的用法
2017/08/17 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
layui实现数据分页功能
2019/07/27 Javascript
vue实现图片上传功能
2020/05/28 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python素数筛选法浅析
2018/03/19 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
JDO的含义
2012/11/17 面试题
中学教师岗位职责
2013/11/26 职场文书
道德模范先进事迹
2014/02/14 职场文书
小组名称和口号
2014/06/09 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang