@[toc]
1.创建数据表
1.1 创建用户表
2安装并配置mysql文件
2.1安装mysql模块
npm i mysql@2.18.1
2.2 在db index中
const mysql=require('mysql')
//创建数据库连接对象
const db=mysql.createPool({
host:'localhost',
user:'root',
password:'123456',
database:'my_sql-o1'
})
//向外共享
module.exports=db
3.注册功能
注册的一般流程
1.校验表单数据是否合法
2.检测用户名是否占用
3.密码加密处理
4.插入新用户
3.1检测表单数据合法
//对客户端的数据进行校验
if(userInfo.username==''||userInfo.password==''){
return res.send({
status:1,
msg:'用户名和密码不能为空'
})
}
3.2判断用户占用
//查询用户是否重复
let sql='select * from ev_users where username=?'
db.query(sql,[userInfo.username],(error,result)=>{
if(error) {
return res.send({
status:1,msg:error.message})
}
console.log(result.length)
if(result.length>0){
return res.send({
status:1,msg:"用户被占用"})
}
3.3 密码加密
1.下载bcryptjs
npm i bcryptjs@2.4.3
2.引入bcryptjs
//引入加密包
const bcrypt=require('bcryptjs')
//密码加密
userInfo.password=bcrypt.hashSync(userInfo.password,10)
3.4 插入用户
let sql1='insert into ev_users set ?'
db.query(sql1,{
username:userInfo.username,password:userInfo.password},(error,result)=>{
if(error) return res.send({
status:1,
msg:error.message
})
res.send({
status:0,
msg:"插入成功"
})
})
封装错误处理函数
在app.js
//封装错误处理函数
app.use((req,res,next)=>{
res.cc=function(err,status=1){
res.send({
status,
message:err instanceof Error ?err.message:err
})
}
next()
})
在代码调用
return res.cc('用户被占用')
4.登录功能
登录的一般流程
1.判断前端提交的后端的数据是否合法。
2.查询登录的用户是否存在。
3.判断当前用户的密码是否正确。
4.1 登录密码的判断
bcrypt.compareSync 判断用户输入的密码和数据密码是否正确,其返回类型为布尔值。
//检验密码是否正确 const compareResult=bcrypt.compareSync(userInfo.password,result[0].password)
4.2 生成token字符
1.下jsonwebtoken
npm i jsonwebtoken@8.5.1
2.导入
//引入token
const jwt=require('jsonwebtoken')
3.配置加密形式
4.token加密
jwt.sign 有三个参数依次是 生成token的数据,加密的形式,token有效期
//将用户的信息加密,生成token
const tokenStr=jwt.sign(user,config.jwtscrestKey,{
expiresIn:'10h'
})
res.send({
status:0,
msg:'登录成功',
token:'Bearer '+tokenStr
})
4.3 解析token中间件
1.安装解析中间件
npm i express-jwt@5.3.3
2.在App.js 中引入
//token解析中间件
const expressJWT=require('express-jwt')
//映入解密
const config=require('./config')
app.use(expressJWT({
secret:config.jwtscrestKey}).unless({
path:['/^\/api/']}))
3.在错误中间件中
//错误中间件
app.use((req,res,err,next)=>{
if(err.name=='UnauthorizedError') return res.cc('身份认证失败')
res.cc(err)
})