node.js原生開發服務端項目之使用redis存儲session信息實現登錄

const http = require('http')
const querystring = require('querystring')
const redis = require('redis')

const getCookieExpires = () => {
  const d = new Date()
  d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
  return d.toGMTString()
}

const redisClient = redis.createClient(6379, '127.0.0.1')

redisClient.on("error", function(error) {
  console.error(error);
});

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 (e) {
        resolve(val)
      }
    })
  })
}


const server = http.createServer(async (req, res) => {

  res.setHeader('Content-type', 'application/json')

  const url = req.url
  req.path = url.split('?')[0]
  req.query = querystring.parse(url.split('?')[1])

  req.cookie = {}
  const cookie = req.headers.cookie || ''
  cookie && cookie.split(';').forEach(item => {
    const arr = item.split('=')
    const key = arr[0].trim()
    req.cookie[key] = arr[1].trim()
  })

  let sessionId = req.cookie.sessionId
  if(!sessionId){
    sessionId = `${Date.now()}_${Math.random()}`
    res.setHeader('Set-Cookie', `sessionId=${sessionId};path=/;httpOnly;expires=${getCookieExpires()}`)
    set(sessionId, {})
  }

  req.sessionId = sessionId

  const sessionData = await get(req.sessionId)
  if(sessionData === null){
    set(req.sessionId, {})
    req.session = {}
  } else {
    req.session = sessionData
  }

  if(req.method === 'GET' && req.path === '/login'){
    const { username, password } = req.query
    if(username === 'test' && password === '123'){
      req.session.username = 'test'
      req.session.password = '123'
      // 同步到redis
      set(req.sessionId, req.session)
      res.end('login success')
    } else {
      res.end('login fail')
    }
    return
  }

  if(req.method === 'GET' && req.path === '/getUserInfo'){
    if(req.session.username){
      res.end(JSON.stringify({ username: req.session.username, password: req.session.password }))
    } else {
      res.end('not login')
    }
    return
  }

  res.writeHead(404, { "Content-type": "text/plain" })
  res.write("404 Not Found\n")
  res.end()
})


server.listen(8002)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章