1在app.js 解析cookie
//解析 cookie
req.cookie = {}
const cookieStr = req.headers.cookie || ''
cookieStr.split(';').forEach(item => {
if (!item) {
return
}
const arr = item.split('=')
const key = arr[0].trim()
const val = arr[1].trim()
req.cookie[key] = val
})
2 如果没有 userId 在请求的返回中设置userid
if (needSetCookie) {
res.setHeader('Set-Cookie', `userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`)
}
//设置过期时间
const getCookieExpires = () => {
const d = new Date()
d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
return d.toGMTString()
}
3 将登录成功后 的 userId 和用户信息 保存到 Redis 数据库
启动redis
D:\aaaaa\Redis>redis-server.exe redis.windows.conf
设置配置信息
//redis
REDIS_CONF = {
port: 6379,
host: '127.0.0.1',
}
加载 redis 连接模块
npm i redis -s
写连接工具类
const redis = require('redis')
const { REDIS_CONF } = require('../conf/db')
//创建客户端
const redisClient = redis.createClient(REDIS_CONF.port, REDIS_CONF.host)
redisClient.on('error', err => {
console.log(err);
})
function set (key, val) {
if (typeof val === 'object') {
val = JSON.stringify(val)
}
redisClient.set(key, val, redis.print)
}
function get (key) {
const promise = new Promise((resolve, reject) => {
redisClient.get(key, (err, val) => {
if (err) {
reject(err)
return
}
if (val == null) {
resolve(null)
return
}
try {
resolve(JSON.parse(val))
} catch (e) {
resolve(val)
}
})
})
return promise
}
module.exports = {
set,
get
}
登录成功保存信息
const handleUserRouter = (req, res) => {
const method = req.method
//登录
if (method === 'POST' && req.path === '/api/user/login') {
const { username, password } = req.body
const result = login(username, password)
return result.then(data => {
if (data.username) {
// //设置 session
req.session.username = data.username
req.session.realname = data.realname
set(req.sessionId,req.session)
return new SuccessModel()
}
return new ErrorModel('登录失败')
})
}
}
解析session
//解析 session
let needSetCookie = false
let userId = req.cookie.userid
if (!userId) {
needSetCookie = true
userId = `${Date.now()}_${Math.random()}`
// 初始化 redis 中的 session 值
set(userId, {})
}
// 获取 session
req.sessionId = userId
get(req.sessionId).then(sessionData => {
if (sessionData == null) {
// 初始化 redis 中的 session 值
set(req.sessionId, {})
// 设置 session
req.session = {}
} else {
// 设置 session
req.session = sessionData
}
// 处理 post data
return getPostData(req)