art-template模板引擎
art-template 是一个简约、超快的模板引擎。有腾讯开发并开源,速度性能最好。
安装两个包
npm install --save art-template
npm install --save koa-art-template
引入let render = require('koa-art-template');
下面是使用,首先
render(app, {
root: path.join(__dirname, 'views'),
extname: '.html',
debug: process.env.NODE_ENV !== 'production'
});
然后使用await ctx.render('user');其它和ejs一样
完全兼容ejs模板的语法。
PS:首次使用,可能提示path不存在,需要引入path模块,let path=require("path");
cookie
cookie是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域
名的时候共享数据。
在koa里,cookies不需要安装,直接使用即可。
比如在index页面里面,设置一个cookies
router.get("/",async (ctx)=>{
let zhi="这是js传过来的数据"
await ctx.render("index",{
chuan:zhi
});
ctx.cookies.set("username","zhaoyanwei",{
maxAge:10*1000 //过期时间10秒钟
})
});
然后就可以到别的页面去获取cookies,比如在news页面打印出来
router.get("/news",async (ctx)=>{
let list=[
{title:"红米手机官微宣布将于3月18日",time:"2018-12-24"},
{title:"红米Note 7 Pro最大的升级一是相机",time:"2018-12-26"},
{title:"手持就能拍出明亮清晰的夜景大片",time:"2018-12-25"},
{title:"在同价位极具竞争力",time:"2019-01-21"},
];
await ctx.render("news",{
list
});
var username = ctx.cookies.get("username");
console.log(username)
})
先访问根页面,然后再访问news页面,就可以在控制台看到打印出来的username。
并且十秒钟过期,十秒后在刷新就打印不出来了。浏览器的cookies保存在F12后的application里面,有个cookies,可以看缓存的数据。
Session
session 是另一种记录客户状态的机制,不同的是Cookie 保存在客户端浏览器中,而
session 保存在服务器上。
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session 对象,生
成一个类似于key,value 的键值对, 然后将key(cookie)返回到浏览器(客户)端,浏览
器下次再访问时,携带key(cookie),找到对应的session(value)。客户的信息都保存
在session 中。
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的COOKIE 并进行COOKIE 欺骗
考虑到安全应当使用session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20 个cookie。
先安装npm install koa-session --save
再引入let session = require('koa-session');
配置中间件如下
app.keys = ['some secret hurr'];
const CONFIG = {
key: 'koa:sess',
maxAge: 86400000,//session的过期时间
autoCommit: true,
overwrite: true,
httpOnly: true,//true表示只有服务器端可以获取cookies
signed: true,
rolling: false,
renew: false,
};
app.use(session(CONFIG, app));
然后就可以使用了
设置值ctx.session.infoname="周杰伦";
获取值ctx.session.infoname
我们来实验一下,在login页面设置一个,到about页面去接收
router.get("/login",async (ctx)=>{
ctx.session.infoname="周杰伦";
await ctx.render("login");
});
router.get("/about",async (ctx)=>{
await ctx.render("about");
console.log(ctx.session.infoname);
});