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-vars
module.exports = options => {
return async (ctx, next) => {
console.log('m1 start');
await next();
console.log('m1 end');
};
};
这个next 就是继续向下执行的意思
同样搞一个m2,还要去 config.default 配置一下
// add your middleware config here
config.middleware = ['m1', 'm2'];
注意这个数组中是有顺序的
随后刷新主页
手写一个 httpLog 中间件
这个中间件的功能就是 拦截请求并且将请求相关信息输出在一个文件当中
需要对时间进行处理:引入一个第三方依赖包 熟悉的dayjs
yarn add dayjs
以及node自带的文件处理模块 fs
ctx.app.baseDir
获取文件路径
'use strict';
const dayjs = require('dayjs');
const fs = require('fs');
// eslint-disable-next-line no-unused-vars
module.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