创建服务器
const express=require(‘express’);
const app=express();
要注意的是:
在路由之前
** 创建解决跨域问题的中间件:
const cors=require(‘cors’)
app.use(core())
** 创建处理表单数据的中间件:
app.use (express.json())
app.use(express.urlencoded({extended:false}))
配置解析token的中间件
const expressJWT=require(‘express-jwt’);
const config= require(./config) //配置
//解析中间件,声明哪些不需要保护
app.use(expressJWT ({
secret: config.jwtSecretKey //配置的秘钥
}).unless({
path: [/^\/api\//] // /api下的内容不需要验证token
}))
导入路由,模块化,将不同的路由功能挂载在不同的路由对象上
//导入并使用 用户 注册登录路由模块
app.use('/api', require('./router/user'))
//用户信息路由
app.use('/my', require('./router/userinfo'))
//导入并使用文章分类的路由模块
app.use('/my/article',require('./router/article'))
然后在路由模块再导入具体的处理函数;(用户注册登录模块为例)
const express = require('express')
const router = express.Router()
//导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')
// 导入需要的验证的规则对象
const {
reg_login_shema
} = require('../schema/user')
//注册新用户路由
// expressJoi(reg_login_shema)进行校验
router.post('/reguser', expressJoi(reg_login_shema), require('../router_handler/user/user'))
//登录 expressJoi(reg_login_shema) 校验
router.post('/login', expressJoi(reg_login_shema), require('../router_handler/user/login'))
//暴露出去
module.exports = router
app.listen(3007)在3007端口启动
在登录模块登陆成功后需要设置一个token字符串用于确认用户信息
设置方式:
1,下载并导入jsonwebtoken这个包 用常量jwt接收;
2,在确认用户可以登陆之后,将用户的信息(隐藏隐私信息如密码与头像)通过jwt.sign方法生成token字符串
jst.sign(参数1,参数2,参数3) 参数1为token要包含的用户信息,参数2,为用户设置的秘钥(随便设置) 参数3位对象格式的{expiresIn:‘时效’}设置该token字符串的有效期
解析token:
app.use(expressJWT ({
secret: config.jwtSecretKey //自动将载体部分赋值给req.body,
}).unless({
path: [/^\/api\//]//定义不需要验证的路径
}))
表单数据在提交之前需要先通过一个中间件的验证
1,安装并导入包const joi=require(" @hapi/joi")
2,定义要验证的对象
3,将验证规则对象导出
//定义用户名和密码的验证规则
const username = joi.string().alphanum().min(1).max(10).required();
const password = joi.string().pattern(/^[\S]{6,12}$/).required();
//定义id nickname email的验证规则
const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()
//定义 验证头像avatar的 规则
const avatar = joi.string().dataUri().required();
//注册表单内容的验证规则对象
exports.reg_login_shema = {
body: {
username,
password,
},
}
//用户基本信息的验证规则对象
exports.update_userinfo_schema = {
body: {
id,
nickname,
email,
},
}
//更改密码验证规则对象
exports.update_password_schema = {
body: {
oldPwd: password,
newPwd: joi.not(joi.ref('oldPwd')).concat(password)
},
}
//
exports.update_avatar_schema = {
body: {
avatar,
},
}
**需要对用户密码进行加密,**这样,加入数据库被盗取,也不回使用户密码丢失而产生损失;
1,安装并导入包const bcryptjs = require(‘bcryptjs’)
2, 调用hashSync方法进行加密:
//调用bcryptjs.hashSync()对明文密码进行加密
password = bcryptjs.hashSync(password, 10)
3,参数1为要加密的对象,参数2为定义加密密码计算强度
4,这个方法对相同字符多次加密的结果并不相同,无法解密
5,更改密码时需要比较原密码是否相同;
此时用到另一个方法:
bcryptjs.compareSync(oldPwd, results[0].password)
results为在数据库查找到的数据结果,上面方法返回值为布尔类型,
在路由之后加一个捕获错误的中间件:
这样出现错误之后,该中间件会捕获错误返货发送,从而防止整个系统的崩溃,其他功能还可以正常使用
app.use((err, req, res, next) => {
//表单验证错误
if (err instanceof Joi.ValidationError) return res.cc(err)
//认证错误,token错误
if (err.name === 'UnauthorizedError') return res.cc('身份认证失败!')
//未知错误
res.cc(err)
})