module.exports和exports的区别
module.exports和exports其实是一个东西,exports如果是指向值类型,那么这两者相等,如果exports指向引用类型,那么这两者就不同。
什么是值类型,什么是引用类型? 值类型存储在栈中,引用类型存储在堆中,值类型赋值的时候,会在栈中拷贝一份,就不会对原来那一份有影响,但是引用类型会改变
用户鉴权
两种方式,一种是session,后端获取登录用户后,生成session存储在redis数据库中,交给前端后,前端每次把session携带在cookie中,WJ项目使用的就是这种鉴权方式,这种鉴权方式适合在前后端不分离的情况下,因为携带cookie可能会存在跨域问题
第二种方式是JWT,请求后端以后,后端生成一个token给前端,然后前端在需要鉴权的请求中携带token,携带方式为:header: { Authorization: {token} } 请求头中这个字段默认是用来获取用户身份的。第二种方法就适用于前后端分离的项目
jsonwebtoken
用户鉴权登录的流程为:每次登录刷新token,前端登陆后,把token放在请求头的header[‘Authorization’]中,然后在需要的时候带上,后端接收到token,验证token是否过期,如果过期反馈给前端,如果没有过期,可以根据token解析出用户的id然后获取用户信息
const jwt = require('jsonwebtoken')
const key = 'nasig345#$n34&^h*523j4k24&$%@'
let result = require('../models/result.js')
/**
* 检查token是否过期
*/
module.exports = async (ctx) => {
const authorization = ctx.get('Authorization')
if(authorization === '') {
ctx.body = new result.ErrorModel(401, '暂无token或token失效')
}
const token = authorization
try {
await jwt.verify(token, key, (err, data) => {
if(err) {
switch(err.name) {
case 'JsonWebTokenError':
ctx.body = new result.ErrorModel(401, '暂无token或token失效')
break;
case 'TokenExpiredError':
ctx.body = new result.ErrorModel(401, '暂无token或token失效')
}
} else {
ctx.body = new result.SuccessModel(200, '操作成功', token)
}
})
} catch(err) {
ctx.body = new result.ErrorModel(401, '暂无token或token失效')
}
return user_id = JSON.stringify(jwt.decode(token))
}