
路由模块
- //导入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.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)
-
- })
- })
-
- }
更新密码:使用的旧密码是正确的
之后重新就是错的
