- 定義中間件
在eggjs中感帅,定義中間件需要寫到app/middleware目錄下(沒有middleware則自己創(chuàng)建一個(gè)),創(chuàng)建一個(gè)JS文件,每一個(gè)JS就是一個(gè)中間件娶耍,可以多個(gè)中間件同時(shí)使用
基本的寫法如下
//1、在js中饼酿,暴露一個(gè)方法
module.exports = (options, app) => {
//2榕酒、返回一個(gè)異步的函數(shù)
return async function login(ctx, next) {
console.log('hello middleware');
await next();
}
}
- 配置中間件
- 當(dāng)你在定義好中間件后在config/config.default.js會(huì)自動(dòng)生成一個(gè)
config.middleware=[]
你只需要在中括號內(nèi)寫下你的js文件名,這即為配置好中間件故俐。 - 如果你的中間件需要傳遞參數(shù)想鹰,可以通過config.login來進(jìn)行參數(shù)的傳遞,在中間件件可以通過options接收傳遞過來的參數(shù)
config.中間件名= {
data: '給中間件傳遞的參數(shù)药版!'
}
- 在框架和插件中使用中間件
框架和插件不支持在 config.default.js 中匹配 middleware辑舷,需要通過以下方式:
// app.js
module.exports = app => {
// 在中間件最前面統(tǒng)計(jì)請求時(shí)間
app.config.coreMiddleware.unshift('report');
};
// app/middleware/report.js
module.exports = () => {
return async function (ctx, next) {
const startTime = Date.now();
await next();
// 上報(bào)請求時(shí)間
reportTime(Date.now() - startTime);
}
};
應(yīng)用層定義的中間件(app.config.appMiddleware)和框架默認(rèn)中間件(app.config.coreMiddleware)都會(huì)被加載器加載,并掛載到 app.middleware 上槽片。
- router 中使用中間件
以上兩種方式配置的中間件是全局的何缓,會(huì)處理每一次請求。 如果你只想針對單個(gè)路由生效还栓,可以直接在 app/router.js 中實(shí)例化和掛載碌廓,如下:
module.exports = app => {
const gzip = app.middleware.gzip({ threshold: 1024 });
app.router.get('/needgzip', gzip, app.controller.handler);
};