持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
项目要求
通过一个小项目实践 Node.js 各个知识点。麻雀虽小,五脏俱全,这个项目会从 0~1,逐步完成所有需求。该项目实现接口有注册、登录、获取用户信息等等
个人中心
重置密码
实现步骤
- 定义路由和处理函数
- 验证表单数据
- 实现重置密码功能
定义路由和处理函数
-
在
/router/userinfo.js
模块中,新增重置密码的路由// 重置密码的路由 router.post('/updatepwd', userinfo_handler.updatePassword) 复制代码
-
在
/router_handler/userinfo.js
模块中,定义并向外共享重置密码的路由处理函数exports.updatePassword = (req, res) => { res.send('ok') } 复制代码
验证表单数据
核心验证思路:旧密码与新密码,必须符合密码的验证规则,并且新密码不能与旧密码一致
-
在
/schema/user.js
模块中,使用exports
向外共享如下的验证规则对象// 验证规则对象 - 更新密码 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 这俩条验证规则 new:joi.not(joi.ref('oldPwd')).concat(password) } } 复制代码
-
在
/router/userinfo.js
模块中,导入需要的验证规则对象// 导入需要的验证规则对象 const { update_userinfo_schema, update_password_schema } = require('../schema/user') 复制代码
-
并在更新密码的路由中,使用
update_userinfo_schema
规则验证表单的数据,示例代码如下:// 更新密码的路由 router.post('/updatepwd',expressJoi(update_password_schema), userinfo_handler.updatePassword) 复制代码
实现重置密码功能
-
根据
id
查询用户是否存在// 定义根据 id 查询用户数据的 SQL 语句 const sql = `select * from ev_users where id=?` // 执行 SQL 语句查询用户是否存在 db.query(sql, req.auth.id, (err, results) => { // 执行 SQL 语句失败 if (err) return res.cc(err) // 检查指定 id 的用户是否存在 if (results.length !== 1) return res.cc('用户不存在') }) 复制代码
-
判断提交的旧密码是否正确
// 判断密码是否正确(不能使用等号判断密码是否正确,因为数据库存储的密码是加密过后的) // 在头部区域导入 bcryptjs 后,即可使用 bcryptjs.compareSync(提交的密码,数据库中的密码) 方法验证密码是否正确 // compareSync() 函数的返回值为布尔值,ture 表示密码正确,false 表示密码错误 // 导入处理密码的模块 const bcrypt = require('bcryptjs') const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password) if (!compareResult) return res.cc('原密码错误') 复制代码
-
对新密码进行
bcrypt
加密之后,更新到数据库中// 定义更新用户密码的 SQL 语句 const sql = 'update ev_users set password=? where id=?' // 对新密码进行 bcrypt 加密处理 const newPwd = bcrypt.hashSync(req.body.newPwd, 10) db.query(sql, [newPwd, req.auth.id], (err, results) => { // 执行 SQL 语句失败 if (err) return res.cc(err) // SQL语句执行成功,但是影响行数不等于 1 if (results.affectedRows !== 1) return res.cc('更新密码失败') // 更新密码成功 res.cc('更新密码成功', 0) }) 复制代码