实现密码修改功能
在router下新建userinfo.js存放用户信息相关的路由
在router_handler下新建userinfo.js存放用户信息相关的路由处理函数
密码修改需要进行token认证,需要在请求头携带Authorization字段
app.js中在所有路由之前,使用express-jwt中间件解析token
1. app.js中添加token解析中间件,在错误级别中间件中添加token解析报错处理
...
// 在路由之前解析token 排除 api和uploads开头的路由
const expressJWT = require('express-jwt') // 解析token
const { jwtConfig } = require('./config') // token配置 记录了 秘钥 有效期
app.use(expressJWT({ secret: jwtConfig.jwtKey, algorithms: ['HS256'] }).unless({ path: [/^\/api/, /^\/uploads/] }))
// 托管静态资源 以后上传文件要用
app.use('/uploads', express.static('./uploads'))
// 定义错误级别中间件
app.use((err, req, res, next) => {
// 字段校验错误捕获
if (err instanceof joi.ValidationError) return res.cc(err)
// 捕获身份认证错误
if (err.name === 'UnauthorizedError') {
if (err.message === 'jwt expired') return res.cc('token过期,请重新登录!', 401)
return res.cc('身份认证失败!', 401)
}
// 其他错误
res.cc(err)
})
...
2. 创建路由
// router/userinfo.js
const { Router } = require('express')
const router = Router()
const validateJoi = require('../utils/validate') // 校验数据
const userSchema = require('../schema/user')
const { updatePwd } = require('../router_handler/userinfo')
// 修改密码
router.put('/updatePwd', validateJoi(userSchema.updatePwd), updatePwd)
module.exports = router
3. 创建路由处理函数
- 检查数据库中是否有这个人
- 校验当前密码是否正确
- 校验要修改的密码和重复的密码是否相同
- 校验要修改的密码是否和原先密码一致
- 全部通过执行更新密码
// router_handler/userinfo.js
const bcrypt = require('bcryptjs') // 密码加密和解密
const db = require('../db/index') // 导入数据库对象
// 修改密码
const updatePwd = (req, res) => {
const user_id = req.query.user_id
const { currentPwd, editPwd, repeatPwd } = req.body
const sql = `select * from users where user_id = ?`
db.query(sql, user_id, (err, result) => {
if (err) return res.cc(err)
if (result.length !== 1) return res.cc('用户不存在!')
console.log(currentPwd);
const compareResult = bcrypt.compareSync(currentPwd, result[0].password)
if (!compareResult) return res.cc('当前密码错误!')
if (currentPwd === editPwd) return res.cc('不能与原先密码一致!')
const sql1 = `update users set ? where user_id = '${user_id}'`
const password = bcrypt.hashSync(repeatPwd, 10)
db.query(sql1, {password: password}, (err, result) => {
if (err) return res.cc(err)
if (result.affectedRows !== 1) return res.cc('修改失败,请重试!')
res.send({
status: 0,
msg: '修改成功!'
})
})
})
}
4. 测试密码修改接口:http://127.0.0.1:8086/my/updatePwd
- 请求路径:/my/updatePwd
- 请求方法:put
- 请求头:Authorization: 登录token
- 请求参数:
请求参数 | 参数类型 | 参数说明 | 备注 |
---|---|---|---|
user_id | Number | 用户id | 以query参数携带 |
currentPwd | String | 当前密码 | |
editPwd | String | 要修改的密码 | |
repeatPwd | String | 重复修改的密码 |
评论 (0)