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

当输入错误的原密码时

输入正确的原密码时

相关推荐
加班是不可能的,除非双倍日工资14 分钟前
css预编译器实现星空背景图
前端·css·vue3
wyiyiyi1 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip1 小时前
vite和webpack打包结构控制
前端·javascript
excel2 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
阿华的代码王国2 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼2 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jimmy2 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
ZXT2 小时前
promise & async await总结
前端
Jerry说前后端2 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
画个太阳作晴天2 小时前
A12预装app
linux·服务器·前端