Node系列学习之Redis(二)

254 阅读2分钟

这是我参与更文挑战的第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使用一下, 基本上登录就没问题了~