- 定义中间件
在eggjs中,定义中间件需要写到app/middleware目录下(没有middleware则自己创建一个),创建一个JS文件,每一个JS就是一个中间件,可以多个中间件同时使用
基本的写法如下
//1、在js中,暴露一个方法
module.exports = (options, app) => {
//2、返回一个异步的函数
return async function login(ctx, next) {
console.log('hello middleware');
await next();
}
}
- 配置中间件
- 当你在定义好中间件后在config/config.default.js会自动生成一个
config.middleware=[]
你只需要在中括号内写下你的js文件名,这即为配置好中间件。 - 如果你的中间件需要传递参数,可以通过config.login来进行参数的传递,在中间件件可以通过options接收传递过来的参数
config.中间件名= {
data: '给中间件传递的参数!'
}
- 在框架和插件中使用中间件
框架和插件不支持在 config.default.js 中匹配 middleware,需要通过以下方式:
// app.js
module.exports = app => {
// 在中间件最前面统计请求时间
app.config.coreMiddleware.unshift('report');
};
// app/middleware/report.js
module.exports = () => {
return async function (ctx, next) {
const startTime = Date.now();
await next();
// 上报请求时间
reportTime(Date.now() - startTime);
}
};
应用层定义的中间件(app.config.appMiddleware)和框架默认中间件(app.config.coreMiddleware)都会被加载器加载,并挂载到 app.middleware 上。
- router 中使用中间件
以上两种方式配置的中间件是全局的,会处理每一次请求。 如果你只想针对单个路由生效,可以直接在 app/router.js 中实例化和挂载,如下:
module.exports = app => {
const gzip = app.middleware.gzip({ threshold: 1024 });
app.router.get('/needgzip', gzip, app.controller.handler);
};