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)