浅谈在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 相关文章推荐
javascript 二分法(数组array)
Apr 24 Javascript
JavaScript 计算图片加载数量的代码
Jan 01 Javascript
JavaScript图像延迟加载库Echo.js
Apr 05 Javascript
Bootstrap风格的zTree右键菜单
Feb 17 Javascript
javascript遍历json对象的key和任意js对象属性实例
Mar 09 Javascript
node.js实现登录注册页面
Apr 08 Javascript
Jquery中attr与prop的区别详解
May 27 jQuery
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
vue项目强制清除页面缓存的例子
Nov 06 Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 18 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 Vue.js
jQuery treeview树形结构应用
Mar 24 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获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
python如何重载模块实例解析
2018/01/25 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
美国保健品专家:Life Extension
2018/05/04 全球购物
Weblogic的布署方式
2013/08/23 面试题
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
生产内勤岗位职责
2013/12/07 职场文书
抽奖活动主持词
2014/03/31 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers