Node.js - 项目实践之个人中心(六)

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

项目要求

通过一个小项目实践 Node.js 各个知识点。麻雀虽小,五脏俱全,这个项目会从 0~1,逐步完成所有需求。该项目实现接口有注册、登录、获取用户信息等等

截屏2022-05-28 下午11.35.33.png


个人中心

重置密码

实现步骤
  • 定义路由和处理函数
  • 验证表单数据
  • 实现重置密码功能
定义路由和处理函数
  1. /router/userinfo.js 模块中,新增重置密码的路由

    // 重置密码的路由
    router.post('/updatepwd', userinfo_handler.updatePassword)
    复制代码
  2. /router_handler/userinfo.js 模块中,定义并向外共享重置密码的路由处理函数

    exports.updatePassword = (req, res) => {
        res.send('ok')
    }
    复制代码
验证表单数据

核心验证思路:旧密码与新密码,必须符合密码的验证规则,并且新密码不能与旧密码一致

  1. /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)
        }
    }
    复制代码
  2. /router/userinfo.js 模块中,导入需要的验证规则对象

    // 导入需要的验证规则对象
    const { update_userinfo_schema, update_password_schema } = require('../schema/user')   
    复制代码
  3. 并在更新密码的路由中,使用 update_userinfo_schema 规则验证表单的数据,示例代码如下:

    // 更新密码的路由  
    router.post('/updatepwd',expressJoi(update_password_schema), userinfo_handler.updatePassword)
    复制代码
实现重置密码功能
  1. 根据 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('用户不存在')
    })
    复制代码
  2. 判断提交的旧密码是否正确

    // 判断密码是否正确(不能使用等号判断密码是否正确,因为数据库存储的密码是加密过后的)
    // 在头部区域导入 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('原密码错误')
    复制代码
  3. 对新密码进行 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)
    })
    复制代码

猜你喜欢

转载自juejin.im/post/7104504644424237092