04-博客api接口项目实战之密码修改

辰漪
2022-01-20 / 0 评论 / 22 阅读 / 正在检测是否收录...

实现密码修改功能

在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_idNumber用户id以query参数携带
currentPwdString当前密码
editPwdString要修改的密码
repeatPwdString重复修改的密码
0
选择打赏方式:
微信

评论 (0)

取消