express文档 : https://www.expressjs.com.cn/guide/using-middleware.html
sequelize文档: https://github.com/demopark/sequelize-docs-Zh-CN/blob/master/Readme.md
ORM(sequelize)
ORM(Object Relational Mapping)对象关系映射,减小操作层的代码量,直接方便的操作数据库。
使用前,确保sequelize已经安装
1 | npm install --save sequelize |
1 | /* |
至此,基本的sequlize就可以跑起来了。
原生SQL方法
sequelize的确方便,但他的查询语句较为繁琐,这里我们还可以使用原生mysql语句。
1 | /** |
ORM和原生SQL语句之间并不冲突,合理选择使用即可。两个一起用也可以
JWT(token验证)
jwt(jsonwebtoken)验证,前后端验证的一种方法。
express实现jwt验证
1 | // 安装 express-jwt |
至此,token验证就可以跑起来了。在发送http时,headers中配置 Authorization: 'Bearer ${token}'
即可,当然还可以继续再次封装。
middare(中间件)
中间件用来处理后端服务,对前端的路由请求进行过滤处理。
express本来就是服务加中间件的集合,不同的中间件构成了完整的api逻辑处理。
应用级中间件绑定在APP内,路由中间件绑定在路由,除此之外,还有内置中间件,错误处理中间件等。
不带有路由限制的中间件是会被所有路由执行的。
1 | app.use(middareFun) //所有请求都会触发 |
这里我们优化了上面的 token 验证中间件。
1 | /** |
至此,中间的剥离优化完整。
封装log
在调试中,可以封装一个log用来替代 console.log
1 | /** |
跨域
在搭建完后端api后,需要在前端调试。无论是小程序还是vue的webapp,访问本地连接会出现跨域问题(小程序得在开发工具上关闭域名检测,小程序默认https),如图:
此时需要在app.js内加入允许跨域访问
1 | /* |
此时,我们的vue前端使用axios携带token就可以请求到服务端接口了
morgan日志
日志,记录服务器的操作行为,这里使用 morgan 把日志记录在本地文件保存。
/**
* path: @/utils/morgan.js
* desc: 封装一个morgan
*/
var path = require('path');
var fs = require('fs')
var morgan = require('morgan');
var FileStreamRotator = require('file-stream-rotator')
var logDirectory = path.join(__dirname, 'log')
fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory)
morgan.token('timeStamp', function(req, res){
let date = new Date()
let logHour = date.getHours() < 10 ? `0${date.getHours()}` : date.getHours()
let logMinute = date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes()
let logSecond = date.getSeconds() < 10 ? `0${date.getSeconds()}` : date.getSeconds()
let logDate = `${logHour}:${logMinute}:${logSecond}`
return logDate
});
// 自定义format,其中包含自定义的token
morgan.format('joke', '[joke :timeStamp] :remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms');
// create a rotating write stream
var accessLogStream = FileStreamRotator.getStream({
date_format: 'YYYYMMDD',
filename: path.join(logDirectory, 'access-%DATE%.log'),
frequency: 'daily',
verbose: false
})
module.exports = {morgan, accessLogStream}
/*
* path: @/app
* 引用这个日志系统
*/
app.use(morgan('joke')); //服务器输入实时日志
app.use(morgan('short', {stream: accessLogStream})); //记录日志在文件中
至此,我们可以在 /utils
路径下看到创建的 log 文件夹,日志已经根据 file-stream-rotator 插件做了分割,每一天的日志集约在一个文件。以防日志过多导致混乱。