Node编写重置用户密码接口

目录

前言

定义路由和处理函数

验证表单数据

实现重置密码功能


前言

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

定义路由和处理函数

路由

javascript 复制代码
// 重置密码的路由
router.post('/updatepwd', userinfo_handler.updatePassword)

处理函数

javascript 复制代码
exports.updatePassword=(req,res)=>{
    res.send('重置成功')
}

postman验证

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

验证表单数据

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

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

导入验证规则对象

javascript 复制代码
// 导入需要的验证规则对象
const { update_password_schema } = require('../schema/user')

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

javascript 复制代码
//重置用户密码

router.post('/updatePwd',expressJoi(update_password_schema),userinfo_handler.updatePassword)

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

实现重置密码功能

定义sql语句

javascript 复制代码
const sql = 'select * from ev_users where id=?'

db.query()调用sql语句

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

导入bcryptjs密码加密模块

javascript 复制代码
const bcrypt = require('bcryptjs')

判断原密码是否正确

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

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

对新密码加密

javascript 复制代码
const newPwd = bcrypt.hashSync(req.body.newPwd,10)

定义sql语句

javascript 复制代码
const sql = 'update ev_users set password =? where id =?'

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

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

重置密码接口完整代码

javascript 复制代码
// 导出重置用户密码
exports.updatePassword=(req,res)=>{
    // 定义sql语句
    const sql = 'select * from ev_users where id=?'
    db.query(sql,req.auth.id,(err,results)=>{
        // 判断sql语句是否正确
        if(err) return res.send({status:1,message:err.message})
        // 检查id是否存在
        if(results.length!==1) return res.send({status:1,message:'该用户不存在'})
        // 验证密码是否正确
        const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
        if(!compareResult) return res.send({status:1,message:'原密码错误'})
        // 定义sql语句
        const sql = 'update ev_users set password =? where id = ?'
        // 对新密码进行加密
        const newPwd = bcrypt.hashSync(req.body.newPwd,10)

        // 执行sql语句,根据id查找
        db.query(sql,[newPwd,req.auth.id],(err,results)=>{
            // sql语句执行失败
            if(err) return res.send({status:1,message:err.message})
            // sql语句执行成功,但影响行数不为1
            if(results.affectedRows!==1) return res.send({status:1,message:'更新密码失败'})
            res.send({status:0,message:'密码更新成功'})
        })
    })
}

使用postman模拟发送请求

用户b,原密码为000000

当输入错误的原密码时

输入正确的原密码时

相关推荐
乘风gg1 小时前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭2 小时前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒2 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭2 小时前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
Hyyy3 小时前
理解LLM的基本工作原理:预训练、微调、推理的区别
前端
Gatlin4 小时前
前端逆向与反逆向:一场猫鼠游戏的底层逻辑与实战
前端
Pedantic4 小时前
本地通知(Local Notifications)学习笔记
前端
森蓝情丶4 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
爱勇宝4 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员
Pedantic5 小时前
Combine 框架学习笔记
前端