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