这是我参与更文挑战的第19天,活动详情查看:更文挑战
工具函数封装
在上一篇文章中封装了node中使用redis的工具函数,再简单看一下:
src/conf/db.js
const env = process.env.NODE_ENV // 获取环境参数
// 配置
let MYSQL_CONF
let REDIS_CONF
if (env == 'dev') {
// mysql
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'wyf666...',
port: '3306',
database: 'myblog'
}
// redis
REDIS_CONF = {
port: 6379,
host: '127.0.0.1'
}
}
if (env == 'production') {
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'wyf666...',
port: '3306',
database: 'myblog'
},
// redis
REDIS_CONF = {
port: 6379,
host: '127.0.0.1'
}
}
module.exports = {
MYSQL_CONF,
REDIS_CONF
}
db/redis.js
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.error(err)
})
function set(key, val) {
if (typeof val == 'object') {
val = JSON.stringify(val)
}
redisClient.set(key, val, redis.print)
}
function get(key) {
return 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 (error) {
resolve(val)
}
})
})
}
module.exports = {
set,
get
}
工具函数暴露了两个方法, get() 和 set, 分别设置和取出 redis中的数据
redis的使用
...
// 引入工具函数方法
const { get, set } = require('./src/db/redis')
...
// 解析session, 使用redis
let needSetCookie = false // 是否设置Set-Cookie, 默认为false
let userId = req.cookie.userId // 在req中获取userId
// 对是否存在userId分别进行处理
if (!userId) {
needSetCookie = true // 打开需要服务端设置Cookie开关
userId = `${Date.now()}_${Math.random()}` // 随机生成userId
// 初始化 redis 中的 session 值
set(userId, {})
}
// 获取session
req.sessionId = userId // 设置req.sessionId
get(req.sessionId)
.then(sessionData => {
// redis中的sessionData为null时
if (sessionData == null) {
// 初始化 redis 中的 session 值
set(req.sessionId, {})
// 设置session
req.session = {}
} else {
req.session = sessionData
}
console.log('req.session: ', req.session)
// 处理 postData
return getPostData(req)
})
.then(postData => {...})
src/router/user.js
const { login } = require('../controller/user')
const { SuccessModel, ErrorModel } = require('../model/resModel')
const {set} = require('../db/redis')
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
// 同步到 redis
set(req.sessionId, req.session)
return new SuccessModel()
}
return new ErrorModel('登录失败~')
})
}
// 登录验证的测试
if(method == 'GET' && req.path == '/api/user/login-test') {
if(req.session.username) {
return Promise.resolve(new SuccessModel({
session: req.session
}))
}
return Promise.resolve(new ErrorModel('尚未登录~'))
}
}
module.exports = handleUserRouter
在登录接口中将session中的数据同步到redis中
今天就先到这了, redis的使用基本就是这样了, 回头再简单的在每个接口中稍微改动下, 将redis的get,set使用一下, 基本上登录就没问题了~