Eggjs 本质上是对 koa 框架的二次封装,所以学习 koa 的中间件就等于学习 Eggjs 的中间件
什么是Koa的中间件
通俗的讲:中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,我们就可以把它叫做中间件。 在express中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处理请求-响应循环流程中的中间件,一般被命名为 next 的变量。在Koa中中间件和express有点类似。
中间件的功能包括:
- 执行任何代码。
- 修改请求和响应对象。
- 终结请求-响应循环。
- 调用堆栈中的下一个中间件。
实际项目中的作用
一句话概括:使用中间件对请求进行连接,增加一些额外的处理
koa 的中间件洋葱模型

中间件按照顺序从外到内一层层执行,并且每个中间件都会执行两次
egg 中简单上手
中间件写法
app/middleware/m1.js
'use strict';// eslint-disable-next-line no-unused-varsmodule.exports = options => {return async (ctx, next) => {console.log('m1 start');await next();console.log('m1 end');};};
这个next 就是继续向下执行的意思
同样搞一个m2,还要去 config.default 配置一下
// add your middleware config hereconfig.middleware = ['m1', 'm2'];
注意这个数组中是有顺序的
随后刷新主页
手写一个 httpLog 中间件
这个中间件的功能就是 拦截请求并且将请求相关信息输出在一个文件当中
需要对时间进行处理:引入一个第三方依赖包 熟悉的dayjsyarn add dayjs
以及node自带的文件处理模块 fsctx.app.baseDir获取文件路径
'use strict';const dayjs = require('dayjs');const fs = require('fs');// eslint-disable-next-line no-unused-varsmodule.exports = options => {return async (ctx, next) => {const sTime = Date.now();const startTime = dayjs(Date.now()).format('YYYY-MM-DD HH:mm:ss');const req = ctx.request;await next();const log = {method: req.method,url: req.url,data: req.body,startTime,endTime: dayjs(Date.now()).format('YYYY-MM-DD HH:mm:ss'),timeLength: Date.now() - sTime,};// console.log(log);const dir = ctx.app.baseDir;const data =dayjs(Date.now()).format('YYYY-MM-DD HH:mm:ss') +' [httpLog] ' +JSON.stringify(log) +'\r\n';fs.appendFileSync(dir + '/httpLog.log', data);};};
配置
config.default.js
config.middleware = ['httpLog'];// 这里面就是 中间件的参数config.httpLog = {type: 'all',};
config.httpLog 中就是该 httpLog 中间件的的配置参数即 options
效果


