目录
接前面文章,本文介绍如何编写重置用户密码接口
路由
- // 重置密码的路由
- router.post('/updatepwd', userinfo_handler.updatePassword)
处理函数
- exports.updatePassword=(req,res)=>{
- res.send('重置成功')
- }
postman验证
需要在headers中添加请求头authorization,并且加上在登录时生成的token值
定义验证规则对象并将其导出
- // 验证规则对象 - 重置密码
- 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),
- },
- }
导入验证规则对象
- // 导入需要的验证规则对象
- const { update_password_schema } = require('../schema/user')
在重置密码路由中添加验证
- //重置用户密码
-
- router.post('/updatePwd',expressJoi(update_password_schema),userinfo_handler.updatePassword)
使用postman,当原密码与密码相同时
定义sql语句
const sql = 'select * from ev_users where id=?'
db.query()调用sql语句
- 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密码加密模块
const bcrypt = require('bcryptjs')
判断原密码是否正确
- // 判断提交的旧密码是否正确
- const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
- 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语句
- 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:'密码更新成功'})
- })
重置密码接口完整代码
- // 导出重置用户密码
- 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
当输入错误的原密码时
输入正确的原密码时