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

定义路由和处理函数

 

路由模块 

//导入express模块
const express=require('express')

//创建路由对象
const Router=express.Router()
//导入处理函数的模块
const userInfo_hander=require('../router_handler/userinfo')

//挂载具体路由1
//监听客户端获取用户基本信息
Router.get('/userinfo',userInfo_hander.getUserInfo)

//1、导入验证表单数据的中间件
var expressJoi = require('@escook/express-joi')
//2、导入需要验证的规则对象
const {update_userinfo_schema}=require('../schema/user')//存放是是规则_body里面的对象
//挂载具体路由2
//更新用户的基本信息
Router.post('/userinfo',expressJoi(update_userinfo_schema), userInfo_hander.updateUserInfo)
//挂载具体路由3
//更新密码的路由
Router.post('/updatepwd', userInfo_hander.updatePassword)
//向外导出路由
module.exports=Router//之前={对象 对象里面是属性 可以做一个省略}

路由处理函数模块

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

测试 

 

验证表单数据(joi)

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

规则:


//表单数据验证的包
const joi=require('joi')
//定义验证规则——查看对应文档

//用户名的验证规则
const username=joi.string()
            .min(1)//最小长度是1
            .max(10)//最大长度是10
            .required()//所必须传递的字符串
            //密码的验证规则
const password= joi.string() .pattern(/^[\S]{6,15}$/)
          //   .pattern(/^[\S]{6,15}$/)//满足自定义正则表达式——且长度为6——12之间\S不能有空字符——
             .required()//使用正则表达式
            //定义密码重验证的规则    
            //repeat_password: joi.ref('password'),
//定义更新用户的验证规则
const id1=joi.number().integer().min(1).required()//integer整数
const nickname1 = joi.string().required()
const email1 = joi.string().email().required()
module.exports={
    body:{//校验req.body中的数据
        username,//与客户端提交的属性要相同——属于bady中的username属性
        password,//password:password//相同在es6中可以简写 省去
    }

}
//验证规则对象——更新用户基本信息
module.exports.update_userinfo_schema ={
    body:{//校验req.body中的数据
        //与客户端提交的属性要相同——属于bady中的username属性
        id:id1,//id是body传过来的参数
        nickname:nickname1,
        email:email1,
        
    }

}
//验证规则对象——重置密码
module.exports.update_password_schema  ={
    body:{//校验req.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),
        
    }

}

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

//导入express模块
const express=require('express')

//创建路由对象
const Router=express.Router()
//导入处理函数的模块
const userInfo_hander=require('../router_handler/userinfo')

//挂载具体路由1
//监听客户端获取用户基本信息
Router.get('/userinfo',userInfo_hander.getUserInfo)

//1、导入验证表单数据的中间件
var expressJoi = require('@escook/express-joi')
//2、导入需要验证的规则对象
const {update_userinfo_schema}=require('../schema/user')//存放是是规则_body里面的对象
//挂载具体路由2
//更新用户的基本信息
Router.post('/userinfo',expressJoi(update_userinfo_schema), userInfo_hander.updateUserInfo)
//挂载具体路由3
//更新密码的路由
//2、导入需要验证的规则对象
const {update_password_schema}=require('../schema/user')//存放是是规则_body里面的对象
Router.post('/updatepwd', expressJoi(update_password_schema),userInfo_hander.updatePassword)
//向外导出路由
module.exports=Router//之前={对象 对象里面是属性 可以做一个省略}

 an invalid value:值一样是非法的

 

实现重置密码的功能

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

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

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

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

 旧密码错误

 旧密码正确

 

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

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

        })
    })
   
}

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

 之后重新就是错的

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值