koa2中session配置和路由的处理
koa2中session处理
session是管理前台传输过来的cookie值,用于缓存cookie。由于单个进程之间的session是不能够共享的,因此需要将所有的seesion缓存的数据放在redis之中。以达到数据共享的目的。在koa2中需要引入两个插件来管理数据它们分别代表session与session和redis的连接,这两个插件为koa-generic-session和koa-redis。
具体对于session的配置如下:
app.keys = ['we#ds_45456@']
app.use(session({
cookie: {
path: '/',
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000
},
// 配置redis
store: redisStore({
// all : '127.0.0.1:6379' //本地redis地址,根据需求进行设置
all: `${REDIS_CONF.host}:${REDIS_CONF.port}`
})
}))
在上面的代码中app.keys代表的是session数据储存中数据加密,以保证用户数据的安全性。设置好密匙后,就在session中去配置cookie与store,在store中储存session的内容是在redis当中的,此时需要根据实际的redis的ip地址与其端口号,所以在这里引入`${REDIS_CONF.host}:${REDIS_CONF.port}`,在这个部分是在db.js中配置好的服务器的地址到此为止,session就配置完成,这时再在routes中的user下去测试session,因为username与password都需要储存在session当中。测试代码如下
// session test
// router.get('/session-test', async function (ctx, next) {
// if(ctx.session.viewCount == null){
// ctx.session.viewCount = 0;
// }
// ctx.session.viewCount++;
// ctx.body = {
// erron: 0,
// viewCount: ctx.session.viewCount
// }
// })
koa2中路由管理
在koa2中其不像express将路由整合在一起,而是将路由的管理单独生成方法,因此需要在这里去引入第三方库,来管理路由使用const router = require('koa-router'),引入Koa2中封装好的方法,然后再去在路由中去处理。在koa2中其根路由是放在router.prefix()方法当中,在routes中的文件中,该文件所有的路由都必须先去访问这个根路由然后才能去访问其本身的路由
同样在koa2中也封装好了get与post方法。
下面通过一个实际例子来说明这个管理的过程:
const { UserMes } = require('../controller/user');
const { SuccessModel, ErrorModel } = require('../model/resModel');
在这里我们需要对UserMes中的函数做一个更改,因为koa2是基于aysnc/await语法而写的一个框架,所以
在这个部分需要做的处理就是将UserMes中的函数改为aysnc/await格式,更改后的代码如下:
const { exec,escape } = require('../db/mysql')
const { genPassword } = require('../utils/cryp')
const UserMes = async (username,password) => {
//使用mysql中的escape来防止sql的注入
const passWord = escape(password);
//进行加密
password = genPassword(passWord);
const userName = escape(username);
const sql = `
select username,realname from user where username = ${userName} and password = ${password};
`;
const data = await exec(sql);
return data[0] || {};
}
module.exports = {
UserMes
}
在user路由中首先引入的为根路由:router.prefix('/api/user')
然后再是对于user路由信息做一个处理,代码如下:
//ctx中包含有已经处理好的req res
router.post('/login', async (ctx, next) => {
const { username, password } = ctx.request.body;
const data = await UserMes(username, password);
if (data.username) {
//设置session
ctx.session.username = data.username;
ctx.session.realname = data.realname;
ctx.body = new SuccessModel()
return;
}
ctx.body = new ErrorModel('登录失败')
})
最后将处理好的路由放入到app.js这个入口文件中去并引入const user = require('./routes/user'),然后使用app.use(user.routes(), user.allowedMethods())进行连接即可。至此为止,管理路由的部分处理完毕。主要注意的一个地方就是koa2是基于aysnc/await封装的一个框架,在其内部所有关于函数的处理,都必须使用这种异步处理的方式。