当前位置:首页 > 日记 > 正文

浅谈在koa2中实现页面渲染的全局数据

浅谈在koa2中实现页面渲染的全局数据

最近用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。这样一来,在页面渲染的时候,就会带上用户信息了。而不需要再在各处去自己手动添加。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

利用SSL加密增强FTP服务器的安全性

利用SSL加密增强FTP服务器的安全性

服务器,增强,加密,安全性,电脑软件,一般的FTP服务器是以明文方式传输数据的,安全性极差,信息很容易被盗,即使它提供了SSL加密功能,默认情况下也可能没有启用,如大家常用的Serv-U FTP服务器(以下简称Serv-U)。为了保证特殊环境下的数据安全,有时是有…

PS是如何给动态画面增加动态效果的

PS是如何给动态画面增加动态效果的

动态,画面,效果,电脑软件,PS,一幅图片,如何用ps软件创造动态效果,几个步骤可以使画面充满动感。 软件名称:Adobe PS图象处理软件8全绿色中文版软件大小:150.1mb更新时间:2015-11-04 1,将图片拖到PS操作界面;复制图层并将原始图层关闭到眼睛。 2。…

excel函数的使用

excel函数的使用

函数,电脑软件,excel,这里介绍一种函数使用方法,主要介绍求和函数sum和求平均数函数average 。1、SUM求和函数例如上面这张成绩表,要计算郝思嘉的成绩总分,在后面的单元格内输入sum函数: =sum(C4:D4) ,然后回车即可得到总分。 我们来看一下sum…

Word插入Excel图表不显示怎么办

Word插入Excel图表不显示怎么办

图表,显示,解决方法,步骤,文档,  在做Word文档里,想插入EXCEL图表,可是显示出来的却是一段代码。怎么弄都弄不好,这该怎么办?以下是小编为大家整理的Word文档插入Excel图表不显示的解决办法,希望大家能够从中有所收获!Word文档插入Excel图表…

腾讯qq缓存文件清理

腾讯qq缓存文件清理

缓存文件,腾讯,电脑软件,qq,电脑QQ客户端用的时间久了,会在系统C盘之下残留很多垃圾文件或插件。所以简单清理一下,就可以为自己的爱机提速不少哟~注意清理前,先退出QQ客户端再操作清理C盘应用数据目录在计算机地址栏直接输入 %AppData%Tencen…

Serv-U FTP的PASV和PORT模式

Serv-U FTP的PASV和PORT模式

模式,电脑软件,FTP,Serv,PORT,注:我们在使用ftp://222.222.222.222 (此IP为虚拟内网ftp服务器映射公网IP),提示如下错误:ftp服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹。在解决此问题前,请先看下文:FTP的连接一般是有两个连接的,…

浅谈ThinkPHP中initialize和constr

浅谈ThinkPHP中initialize和constr

浅谈,区别,电脑软件,initialize,ThinkPHP,ThinkPHP中initialize()和construct()这两个函数都可以理解为构造函数,前面一个是tp框架独有的,后面的是php构造函数,那么这两个有什么不同呢?在网上搜索,很多答案是两者是一样的,ThinkPHP中initialize相…

的长度,使用LENGTHB介绍,substr和sub

的长度,使用LENGTHB介绍,substr和sub

长度,功能,电脑软件,LENGTHB,substrb,我记得我曾在形式的发展做出了这样的错误,在形式方面,对应于数据库中的字段在表的数据库,假设这场一般会使用长度20个汉字,后来当我在形式上的发展,当项目类型的长度设置我,惯性将50byte,我认为即使是20个汉字…

QQ音乐如何设置铃声手机QQ音乐设置

QQ音乐如何设置铃声手机QQ音乐设置

音乐,设置,铃声,如何设置,电脑软件,有时,当你听到一些你喜欢的音乐,你想用它作为铃声。如何通过QQ音乐设置你最喜欢的铃声让我们来了解一下QQ音乐设置铃声的方式。 手机QQ音乐铃声设置方法 这个方法是愚蠢的,但它可以肯定,它是找到你的手机铃…

ps滤镜制作动态水波效果

ps滤镜制作动态水波效果

滤镜,动态,水波,效果,电脑软件,   这篇教程教PS学习者们使用PS滤镜制作动态水波效果,教程制作出来的水波效果还挺不错的,制作难度一般,推荐过来和学习啦的朋友们一起分享学习了。Photoshop滤镜制作动态水波效果先来看看最终的效果…

如何设置免费QQ空间背景音乐

如何设置免费QQ空间背景音乐

空间,背景音乐,如何设置,电脑软件,QQ,如果你想把你喜欢的歌曲作为QQ空间的背景音乐,那其实很简单。它只需要一个网络链接,然后轻松操作几个步骤,你就可以设置你的QQ空间背景音乐,让你的空间更具特色,然后跟着一点免费的背景音乐。 QQ空间背景音…

javascript编程模型构造器模式的实例分析

javascript编程模型构造器模式的实例分析

编程,模型,模式,构造器,实例分析,本文演示了Javascript编程模式的构造函数模式: 在经典的OOP语言中,构造函数(也称为构造函数)是初始化对象的特殊方法。 对象构造函数用于创建一个对象,它设置一个类型(类),并且可以接受初始化对象属性和方法的参数。 …