【node.js后台api项目】(六)重置密码接口
1、接口相关信息
- 路由:
/my/updatepwd
- method: post
- 请求头需要携带
Authorization
字段进行身份认证 - 请求体
- oldPwd 原密码
- newPwd 新密码
2、 定义路由和处理函数
- 在 /router/userinfo.js 模块中,新增 重置密码 的路由:
// 重置密码 的路由
router.post('/updatepwd' , userinfo_handler.updatepwd)
- 在
/router_handler/userinfo.js
模块中,定义并向外共享 重置密码 的路由处理函数:
// 重置密码路由处理函数
const updatepwd = (req, res) => {
res.send('ok')
}
老规矩测试一下
3、验证提交的数据
核心思路:新旧密码必须符合密码验证规则,且新旧密码不一致
- 在 /schema/user.js 模块中定义密码验证规则
// 定义重置密码 验证规则
const update_password_schema = {
// 使用 password 这个规则,验证 req.body.oldPwd 的值
oldPwd: Joi.string()
.pattern(/^[\S]{6,12}$/)
.required(),
// 使用 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(
Joi.string()
.pattern(/^[\S]{6,12}$/)
.required()
)
}
- 在
/schema/user.js
中的中间件joiExpress
中加入以下代码
if (req.url === '/updatepwd') {
schema = Joi.object(update_password_schema)
}
- 在 重置密码的路由 中,使用 update_password_schema 规则验证表单的数据
// 重置密码 的路由
router.post('/updatepwd', joiExpress, userinfo_handler.updatepwd)
再测试一下:
4、实现重置密码的功能
- 根据 id 查询用户是否存在:
const sql1 = `select * from ${table.usersTable} from where id=?`
db.query(sql1, [req.user.id], (err, results) => {
if (err) return res.cc(err)
if (results.length !== 1) return res.cc('用户不存在!')
// Todo: 判断密码是否正确
})
- 判断提交的 旧密码 是否正确:
// 导入bcryptjs用于密码加密和解密
const bcrypt = require('bcryptjs')
const compare = bcrypt.compareSync(req.body.oldPwd, results[0].password)
if (!compare) return res.cc('原密码错误!')
- 对新密码进行 bcrypt 加密之后,更新到数据库中:
const newPwd = bcrypt.hashSync(req.body.newPwd, 10)
const sql = `update ${table.usersTable} set password=? where id=?`
db.query(sql, [newPwd], (err, results) => {
if (err) return res.cc(err)
if (results.affectedRows !== 1) return res.cc('重置密码失败!')
return res.cc('重置密码成功~', 0)
})