• nodejs--开发自己的项目——5.2——个人中心模块——重置密码——设置的url:/my/updatepwd——post请求


    定义路由和处理函数

     

    路由模块 

    1. //导入express模块
    2. const express=require('express')
    3. //创建路由对象
    4. const Router=express.Router()
    5. //导入处理函数的模块
    6. const userInfo_hander=require('../router_handler/userinfo')
    7. //挂载具体路由1
    8. //监听客户端获取用户基本信息
    9. Router.get('/userinfo',userInfo_hander.getUserInfo)
    10. //1、导入验证表单数据的中间件
    11. var expressJoi = require('@escook/express-joi')
    12. //2、导入需要验证的规则对象
    13. const {update_userinfo_schema}=require('../schema/user')//存放是是规则_body里面的对象
    14. //挂载具体路由2
    15. //更新用户的基本信息
    16. Router.post('/userinfo',expressJoi(update_userinfo_schema), userInfo_hander.updateUserInfo)
    17. //挂载具体路由3
    18. //更新密码的路由
    19. Router.post('/updatepwd', userInfo_hander.updatePassword)
    20. //向外导出路由
    21. module.exports=Router//之前={对象 对象里面是属性 可以做一个省略}

    路由处理函数模块

    1. 重置用户密码的处理函数
    2. exports.updatePassword=(req,res)=>{//同样也是有权限的接口
    3. res.send('ok')
    4. }

    测试 

     

    验证表单数据(joi)

    旧密码与新密码的值不能一致,但是需规则相同的, joi.ref('规则')//表示和此规则表示值一致, joi.not()表示不相等concat表示合并多条规则

    规则:

    1. //表单数据验证的包
    2. const joi=require('joi')
    3. //定义验证规则——查看对应文档
    4. //用户名的验证规则
    5. const username=joi.string()
    6. .min(1)//最小长度是1
    7. .max(10)//最大长度是10
    8. .required()//所必须传递的字符串
    9. //密码的验证规则
    10. const password= joi.string() .pattern(/^[\S]{6,15}$/)
    11. // .pattern(/^[\S]{6,15}$/)//满足自定义正则表达式——且长度为6——12之间\S不能有空字符——
    12. .required()//使用正则表达式
    13. //定义密码重验证的规则
    14. //repeat_password: joi.ref('password'),
    15. //定义更新用户的验证规则
    16. const id1=joi.number().integer().min(1).required()//integer整数
    17. const nickname1 = joi.string().required()
    18. const email1 = joi.string().email().required()
    19. module.exports={
    20. body:{//校验req.body中的数据
    21. username,//与客户端提交的属性要相同——属于bady中的username属性
    22. password,//password:password//相同在es6中可以简写 省去
    23. }
    24. }
    25. //验证规则对象——更新用户基本信息
    26. module.exports.update_userinfo_schema ={
    27. body:{//校验req.body中的数据
    28. //与客户端提交的属性要相同——属于bady中的username属性
    29. id:id1,//id是body传过来的参数
    30. nickname:nickname1,
    31. email:email1,
    32. }
    33. }
    34. //验证规则对象——重置密码
    35. module.exports.update_password_schema ={
    36. body:{//校验req.body中的数据
    37. // 使用 password 这个规则,验证 req.body.oldPwd 的值
    38. oldPwd: password,//使用老的规则
    39. // 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则,验证 req.body.newPwd 的值
    40. // 解读:
    41. // 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
    42. // 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
    43. // 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则
    44. newPwd: joi.not(joi.ref('oldPwd')).concat(password),
    45. }
    46. }

    在路由之前导入验证规则:

    1. //导入express模块
    2. const express=require('express')
    3. //创建路由对象
    4. const Router=express.Router()
    5. //导入处理函数的模块
    6. const userInfo_hander=require('../router_handler/userinfo')
    7. //挂载具体路由1
    8. //监听客户端获取用户基本信息
    9. Router.get('/userinfo',userInfo_hander.getUserInfo)
    10. //1、导入验证表单数据的中间件
    11. var expressJoi = require('@escook/express-joi')
    12. //2、导入需要验证的规则对象
    13. const {update_userinfo_schema}=require('../schema/user')//存放是是规则_body里面的对象
    14. //挂载具体路由2
    15. //更新用户的基本信息
    16. Router.post('/userinfo',expressJoi(update_userinfo_schema), userInfo_hander.updateUserInfo)
    17. //挂载具体路由3
    18. //更新密码的路由
    19. //2、导入需要验证的规则对象
    20. const {update_password_schema}=require('../schema/user')//存放是是规则_body里面的对象
    21. Router.post('/updatepwd', expressJoi(update_password_schema),userInfo_hander.updatePassword)
    22. //向外导出路由
    23. module.exports=Router//之前={对象 对象里面是属性 可以做一个省略}

     an invalid value:值一样是非法的

     

    实现重置密码的功能

    根据id查询用户是否存在(SQL语句-查询语句-判断数组-进行路由处理函数的判断)

    1. //重置用户密码的处理函数
    2. exports.updatePassword=(req,res)=>{//同样也是有权限的接口
    3. const sqlStr=`select * from ev_users where id = ?`
    4. db.query(sqlStr,[req.auth.id],(err,results)=>{
    5. //执行SQL语句失败
    6. if(err) return res.cc(err)
    7. //执行SQL语句成功,但是结果不存在
    8. if(results.length!==1) return res.cc('用户不存在')
    9. //判断用户输入的旧密码是否正确
    10. res.cc('之后是判断')
    11. })
    12. }

      判断提交的旧密码是否正确(与数据库中保存的密码进行判断--不能使用简单的等号进行判断—用户提交的是明文密码,数据库存储的是加密的密码,所以需要提供bcrypt的方法bcrypt.compareSync(需要比较的值, 已经加密的值))真表示两值相等,假表示不相等

    1. //对密码进行加密比较的模块
    2. const bcrypt=require('bcryptjs')
    3. //重置用户密码的处理函数
    4. exports.updatePassword=(req,res)=>{//同样也是有权限的接口
    5. const sqlStr=`select * from ev_users where id = ?`
    6. db.query(sqlStr,[req.auth.id],(err,results)=>{
    7. //执行SQL语句失败
    8. if(err) return res.cc(err)
    9. //执行SQL语句成功,但是结果不存在
    10. if(results.length!==1) return res.cc('用户不存在')
    11. //判断用户输入的旧密码是否正确
    12. const compareResults= bcrypt.compareSync(req.body.oldPwd, results[0].password)//results[0]c数据库中查到的结果
    13. if(!compareResults) return res.cc('您输入的旧密码错误')
    14. //之后是新密码的注入
    15. res.cc('之后是新密码的跟新')
    16. })
    17. }

     旧密码错误

     旧密码正确

     

    对新密码进行 bcrypt ( 使用包:bcryp.js包(加密之后的密码,无法被逆向破解、同一明文密码多次加密(张三和李四如果密码相同,加密结果不同),得到的加密结果各不相同,保证了安全性)调用bcrypt.hashSync进行加密--归还给表)加密之后,更新到数据库中:

    1. //重置用户密码的处理函数
    2. exports.updatePassword=(req,res)=>{//同样也是有权限的接口
    3. const sqlStr=`select * from ev_users where id = ?`
    4. db.query(sqlStr,[req.auth.id],(err,results)=>{
    5. //执行SQL语句失败
    6. if(err) return res.cc(err)
    7. //执行SQL语句成功,但是结果不存在
    8. if(results.length!==1) return res.cc('用户不存在')
    9. //判断用户输入的旧密码是否正确
    10. const compareResults= bcrypt.compareSync(req.body.oldPwd, results[0].password)//results[0]c数据库中查到的结果
    11. if(!compareResults) return res.cc('您输入的旧密码错误')
    12. //之后是新密码的注入
    13. const sqlStr1=`update ev_users set password=? where id = ?`
    14. //将新密码bcrypt 加密后注入
    15. const newPwd=bcrypt.hashSync(req.body.newPwd,10)
    16. db.query(sqlStr1,[newPwd,req.auth.id],(err,results)=>{
    17. //执行SQL语句失败
    18. if(err) return res.cc(err)
    19. //执行SQL语句成功,但是结果不存在
    20. if(results.affectedRows!==1) return res.cc('更新密码失败')
    21. //成功
    22. res.cc('更新密码成功',0)
    23. })
    24. })
    25. }

     更新密码:使用的旧密码是正确的

     之后重新就是错的

     

     

     

     

  • 相关阅读:
    【Flink】flink 状态恢复 because the operator is not available in the new program
    Redis7--基础篇1(概述,安装、卸载及配置)
    ThingsBoard源码解析-消息队列
    HTML5- 拖拽功能
    Hoops API参考: 3D Graphics System的Set_Color()函数
    图像增强技术与OpenCV实现
    SQL:sql连接那些事儿
    设计模式之 delegate 委托模式:Swift 实现
    (工厂+策略)实现登录功能
    今年嵌入式行情怎么样?
  • 原文地址:https://blog.csdn.net/weixin_47295886/article/details/126929880