// src/router/user.js
const { login } = require('../controller/user')
const { SuccessModel, ErrorModel } = require('../model/resModel')

const handleUserRouter = (req, res) => {
	const method = req.method

	// 登录
	if (method === 'GET' && req.path === '/api/user/login') {
		const { username, password } = req.query
		const result = login(username, password)
		return result.then((data) => {
			if (data.username) {
				// 操作 cookie
				res.setHeader(
					'Set-Cookie',
					`username=${data.username};path=/;httpOnly` // 增加httpOnly
				)
				return new SuccessModel()
			}
			return new ErrorModel('登录失败')
		})
	}
	// 登录验证测试
	if (method === 'GET' && req.path === '/api/user/login-test') {
		if (req.cookie.username) {
			return Promise.resolve(
				new SuccessModel({
					username: req.cookie.username,
				})
			)
		}
		return Promise.resolve(new ErrorModel('尚未登录'))
	}
}
module.exports = handleUserRouter


// app.js
const querystring = require('querystring')
const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')

// 用于处理  post data
const getPostData = (req) => {
	return new Promise((resolve, reject) => {
		if (req.method !== 'POST') {
			resolve({})
			return
		}
		if (req.headers['content-type'] !== 'application/json') {
			resolve({})
			return
		}
		let postData = ''
		req.on('data', (chunk) => {
			postData += chunk.toString()
		})
		req.on('end', () => {
			if (!postData) {
				resolve({})
			}
			resolve(JSON.parse(postData))
		})
	})
}

const serverHandle = (req, res) => {
	// 设置返回格式JSON
	res.setHeader('Content-Type', 'application/json')

	// const resData = {
	// 	name: '双越100',
	// 	site: 'imooc',
	// 	evn: process.env.NODE_ENV,
	// }
	// res.end(JSON.stringify(resData))

	// 处理 path
	const url = req.url
	req.path = url.split('?')[0]

	// 解析 query
	req.query = querystring.parse(url.split('?')[1])

	// 解析cookie
	req.cookie = {}
	const cookieStr = req.headers.cookie || '' // k1 = v1; k2 = v2
	cookieStr.split(';').forEach((item) => {
		if (!item) return
		const arr = item.split('=')
		const key = arr[0].trim() // 清除空格
		const value = arr[1].trim() // 清除空格
		req.cookie[key] = value
	})
	console.log(req.cookie)
	// 处理  post data
	getPostData(req).then((postData) => {
		req.body = postData

		// 处理blog路由
		// const blogData = handleBlogRouter(req, res)
		// if (blogData) {
		// 	res.end(JSON.stringify(blogData))
		// 	return
		// }

		const blogResult = handleBlogRouter(req, res)
		if (blogResult) {
			blogResult.then((blogData) => {
				res.end(JSON.stringify(blogData))
			})
			return
		}

		// 处理user路由
		// const userData = handleUserRouter(req, res)
		// if (userData) {
		// 	res.end(JSON.stringify(userData))
		// 	return
		// }
		const userResult = handleUserRouter(req, res)
		if (userResult) {
			userResult.then((userData) => {
				res.end(JSON.stringify(userData))
			})
			return
		}
		// 未命中路由,返回 404
		res.writeHead(404, { 'Content-Type': 'text/plain' })
		res.write('404 Not Fount\n')
		res.end()
	})
}
module.exports = serverHandle

服务端获取到的cookie的username

服务端获取到的cookie的username

  • 设置过期时间

    // src/router/user.js
    const { login } = require('../controller/user')
    const { SuccessModel, ErrorModel } = require('../model/resModel')
    
    // 获取cookie的过期时间
    const getCookieExpires = () => {
    	const d = new Date()
    	d.setTime(d.getTime() + 24 * 60 * 60 * 1000)
    	console.log('d.toGMTString:', d.toGMTString())
    	return d.toGMTString()
    }
    
    const handleUserRouter = (req, res) => {
    	const method = req.method
    
    	// 登录
    	if (method === 'GET' && req.path === '/api/user/login') {
    		const { username, password } = req.query
    		const result = login(username, password)
    		return result.then((data) => {
    			if (data.username) {
    				// 操作 cookie
    				res.setHeader(
    					'Set-Cookie',
    					`username=${
    						data.username
    					};path=/;httpOnly; expires=${getCookieExpires()}` // 设置过期时间
    				)
    				return new SuccessModel()
    			}
    			return new ErrorModel('登录失败')
    		})
    	}
    	// 登录验证测试
    	if (method === 'GET' && req.path === '/api/user/login-test') {
    		if (req.cookie.username) {
    			return Promise.resolve(
    				new SuccessModel({
    					username: req.cookie.username,
    				})
    			)
    		}
    		return Promise.resolve(new ErrorModel('尚未登录'))
    	}
    }
    module.exports = handleUserRouter
    

# 总结

  • 知道cookie的定义和特点
  • 前后端如何查看和修改cookie?
  • 如何使用cookie使用登录验证?