eggjs的中間件分為全局中間件和router中間件。
全局中間件用法:
// app/middleware/requestTime.js module.exports = () => { return async (ctx: any, next: any) => { ctx.requestBeginTime = +new Date(); await next(); }; }; //中間件寫法一致,都是返回一個async函數,然后async函數的參數包括: ctx、next。
全局中間件調用和配置方法:
// app/config/config_base.js import { join } from 'path'; module.exports = { // 中間件 //可以在配文件中按順序寫需要調用的中間件,參考洋蔥圈模型 middleware: ['requestTime', 'errorHandler', 'koaStatic'], //如果中間件需要參數可以在這里配置,比如: koaStatic: join(__dirname, 'dist') };
router中間件
// app/middleware/headerParse.js module.exports = () => { return async (ctx: any, next: any) => { // 獲取 params ,只能在router中才有這個數據,全局中間件是沒有這個的 let activityId = ctx.params.activityId; const requestParams = { activityId }; ctx.request.requestParams = requestParams; await next(); }; };
router中間件調用:
// app/router.ts import { Application } from 'egg'; export default (app: Application) => { const { router, controller, middlewares, } = app; router.get('/promotion/babelpc/:activityId', middlewares.headerParser(), controller.activity.render); };