JianghuJS自定义中间件

JianghuJS 中间件是啥

在Egg.js中,中间件通过app.middleware属性添加到应用程序中。中间件以函数形式存在,每个中间件都可以接收两个参数:ctx(Context对象)和next(下一个中间件)。当一个HTTP请求被发送到应用程序时,中间件会先处理请求,然后再将请求传递给下一个中间件,最终响应请求

中间件的处理逻辑可以在ctx对象中设置和读取请求的状态和信息,同时,也可以通过next()函数调用下一个中间件,实现中间件的“流水线”作用。当所有中间件都处理完后,请求得到响应并返回给客户端。

江湖js如何自定义中间件

配置

  • 配置文件:/config/middlewareConfig.js
  • middlewareConfig中的配置,会自动合并到config配置中,框架会自动按照一下数组顺序执行相应的中间件方法;

执行顺序

  1. module.exports.middleware = [
  2. // cache
  3. 'prepareCache',
  4. // /upload/*
  5. 'downloadUserInfo',
  6. // /page/*
  7. 'pagePackage', 'pageUserInfo', 'pageAuthorization',
  8. // /pageDoc/*
  9. 'pageDocPackage', 'pageDocUserInfo', 'pageDocAuthorization',
  10. // /resource/*
  11. 'httpPackage', 'httpUserInfo', 'httpAuthorization', 'httpResourceHook'
  12. ];

执行条件

middlewareMatch 按照条件判断是否执行该中间件,不添加在Match的中间件会默认执行;

  1. module.exports.middlewareMatch = {
  2. pagePackage: {
  3. match(ctx) {
  4. // url 格式符合 /appId/page/pageId
  5. return ctx.request.method === 'GET'
  6. && ctx.request.path.startsWith(`/${ctx.app.config.appId}/page/`);
  7. },
  8. },
  9. ...
  10. }

创建中间件

/app/middleware 目录下,每一个js就是一个中间件,文件名与上方middleware配置同名;

  1. ├── middlewareUtil
  2. ├── packageUtil.js
  3. └── userInfoUtil.js
  4. ├── downloadUserInfo.js
  5. ├── httpAuthorization.js
  6. ├── httpPackage.js
  7. ├── httpResourceHook.js
  8. ├── httpUserInfo.js
  9. ├── pageAuthorization.js
  10. ├── pageDocAuthorization.js
  11. ├── pageDocPackage.js
  12. ├── pageDocUserInfo.js
  13. ├── pageHook.js
  14. ├── pagePackage.js
  15. ├── pageUserInfo.js
  16. ├── socketAuthorization.js
  17. ├── socketPackage.js
  18. ├── socketPackageRecord.js
  19. ├── socketResourceAfterHook.js
  20. ├── socketResourceBeforeHook.js
  21. ├── socketUserInfo.js
  22. ├── xiaochengxuAuthorization.js
  23. ├── xiaochengxuPackage.js
  24. ├── xiaochengxuPackageRecord.js
  25. ├── xiaochengxuPageAuthorization.js
  26. ├── xiaochengxuPagePackage.js
  27. ├── xiaochengxuResourceAfterHook.js
  28. ├── xiaochengxuResourceBeforeHook.js
  29. └── xiaochengxuUserInfo.js