导语:
为了避免node后台太多的session,导致内存溢出还有各个后台进程之间不能通讯的问题,我们就要用到redis来存储session,来解决这一系列问题。
1,创建文件conf,在其里面创建db.js,用于存放redis的账号还有密码。
//根据开发或者生产模式来选择数据库
const env = process.env.NODE_ENV
let MYSQL_CONF
let REDIS_CONF
if (env === 'dev') {
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'xiaomizhou123',
port: '3306',
database: 'mydb'
}
//redis_conf
REDIS_CONF = {
port: 6379,
host: '127.0.0.1'
}
}
if (env === 'production') {
//mysql
MYSQL_CONF = {
host: '172.**.**.**',
user: 'root',
password: 'xiaomizhou123',
port: '3306',
database: 'mydb'
}
//redis_conf
REDIS_CONF = {
port: 6379,
host: '172.**.**.**'
}
}
module.exports = {
MYSQL_CONF,
REDIS_CONF
}
2,安装依赖和在app.js中添加一些代码
先安装两个依赖
npm i koa-generic-session
npm i koa-redis
接着修改app.js
const session = require('koa-generic-session')
const redisStore = require('koa-redis')
app.keys = ['xiaomizhou#13800_']
app.use(session({
// 配置 cookie
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}`
})
}))
搞定,接下来就可以用ctx.session来访问用户的session了。具体函数例子如下:
router.get('/list', async function (ctx, next) {
const keyword = ctx.query.keyword || ''
if (ctx.query.isadmin) {
//在session中获取用户的账号信息
if (ctx.session.username == null) {
console.error('is admin, but no login')
// 返回未登录
ctx.body = new ErrorModel('未登录')
return
}
// 获取自己的用户名
author = ctx.session.username
}
//数据库里面查找该作者,该关键词的信息,然后返回
const listData = await getList(author, keyword)
ctx.body = new SuccessModel(listData)
})
补充:
微信搜索【web小馆】,回复全栈博客项目,即可获取项目源码和后续的实战文章教程。每天用最简单朴实的语言,潜移默化的提升你的计算机基础知识和前端技术。小米粥,一个专注的web全栈工程师,我们下期再见!