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

当输入错误的原密码时

输入正确的原密码时

相关推荐
灵感__idea41 分钟前
JavaScript高级程序设计(第5版):好的编程就是掌控感
前端·javascript·程序员
烛阴2 小时前
Mix
前端·webgl
代码续发2 小时前
前端组件梳理
前端
试图让你心动3 小时前
原生input添加删除图标类似vue里面移入显示删除[jquery]
前端·vue.js·jquery
陈不知代码3 小时前
uniapp创建vue3+ts+pinia+sass项目
前端·uni-app·sass
小王码农记3 小时前
sass中@mixin与 @include
前端·sass
陈琦鹏3 小时前
轻松管理 WebSocket 连接!easy-websocket-client
前端·vue.js·websocket
hui函数4 小时前
掌握JavaScript函数封装与作用域
前端·javascript
行板Andante4 小时前
前端设计中如何在鼠标悬浮时同步修改块内样式
前端
Carlos_sam4 小时前
Opnelayers:ol-wind之Field 类属性和方法详解
前端·javascript