• Node编写重置用户密码接口


    目录

    前言

    定义路由和处理函数

    验证表单数据

    实现重置密码功能


    前言

    接前面文章,本文介绍如何编写重置用户密码接口

    定义路由和处理函数

    路由

    1. // 重置密码的路由
    2. router.post('/updatepwd', userinfo_handler.updatePassword)

    处理函数

    1. exports.updatePassword=(req,res)=>{
    2. res.send('重置成功')
    3. }

    postman验证

    需要在headers中添加请求头authorization,并且加上在登录时生成的token值

    验证表单数据

    定义验证规则对象并将其导出

    1. // 验证规则对象 - 重置密码
    2. exports.update_password_schema = {
    3. body: {
    4. // 使用 password 这个规则,验证 req.body.oldPwd 的值
    5. oldPwd: password,
    6. // 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则,验证 req.body.newPwd 的值
    7. // 解读:
    8. // 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
    9. // 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
    10. // 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则
    11. newPwd: joi.not(joi.ref('oldPwd')).concat(password),
    12. },
    13. }

    导入验证规则对象

    1. // 导入需要的验证规则对象
    2. const { update_password_schema } = require('../schema/user')

    在重置密码路由中添加验证

    1. //重置用户密码
    2. router.post('/updatePwd',expressJoi(update_password_schema),userinfo_handler.updatePassword)

    使用postman,当原密码与密码相同时

    实现重置密码功能

    定义sql语句

    const sql = 'select * from ev_users where id=?'

    db.query()调用sql语句

    1. db.query(sql,req.auth.id,(err,results)=>{
    2. //判断sql语句是否正确
    3. if(err) return res.send({status:1,message:err.message})
    4. //判断影响行数是否为1
    5. if(results.length!==1) return res.send({status:1,message:'密码重置失败'})
    6. res.send('密码重置成功')
    7. })

    导入bcryptjs密码加密模块

    const bcrypt = require('bcryptjs')

    判断原密码是否正确

    1. // 判断提交的旧密码是否正确
    2. const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
    3. if (!compareResult) return res.cc('原密码错误!')

    对新密码加密,定义新的更新密码的sql语句并对sql语句操作

    对新密码加密

    const newPwd = bcrypt.hashSync(req.body.newPwd,10)

    定义sql语句

    const sql = 'update ev_users set password =? where id =?'

    使用db.query()调用sql语句

    1. db.query(sql,[newPwd,req.auth.id],(err,results)=>{
    2. if(err) return res.send({status:1.message:err.message})
    3. if(results.affectedRow!==1) return res.send({status:1,message:'更新密码失败'})
    4. res.send({status:0,message:'密码更新成功'})
    5. })

    重置密码接口完整代码

    1. // 导出重置用户密码
    2. exports.updatePassword=(req,res)=>{
    3. // 定义sql语句
    4. const sql = 'select * from ev_users where id=?'
    5. db.query(sql,req.auth.id,(err,results)=>{
    6. // 判断sql语句是否正确
    7. if(err) return res.send({status:1,message:err.message})
    8. // 检查id是否存在
    9. if(results.length!==1) return res.send({status:1,message:'该用户不存在'})
    10. // 验证密码是否正确
    11. const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
    12. if(!compareResult) return res.send({status:1,message:'原密码错误'})
    13. // 定义sql语句
    14. const sql = 'update ev_users set password =? where id = ?'
    15. // 对新密码进行加密
    16. const newPwd = bcrypt.hashSync(req.body.newPwd,10)
    17. // 执行sql语句,根据id查找
    18. db.query(sql,[newPwd,req.auth.id],(err,results)=>{
    19. // sql语句执行失败
    20. if(err) return res.send({status:1,message:err.message})
    21. // sql语句执行成功,但影响行数不为1
    22. if(results.affectedRows!==1) return res.send({status:1,message:'更新密码失败'})
    23. res.send({status:0,message:'密码更新成功'})
    24. })
    25. })
    26. }

    使用postman模拟发送请求

    用户b,原密码为000000

    当输入错误的原密码时

    输入正确的原密码时

  • 相关阅读:
    网络安全管理与运维服务
    【Bluetooth|蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程
    【编程题】【Scratch四级】2019.12 打棒球
    文本向量化
    高级网络调试技巧:使用Charles Proxy捕获和修改HTTP/HTTPS请求
    知识问答之初步入门-2
    java程序设计项目案例化教程题库及答案
    Python 高级语法:一切皆对象
    蓝桥杯(七段码,C++)
    查看apk版本号
  • 原文地址:https://blog.csdn.net/weixin_68854196/article/details/134023108