编写中间件

  1. egg 中编写 koa 的中间件,需要满足一定的规范;

  2. 在实际开发中,绝大部分中间件都是通过一个高阶函数得到的:

    var myMiddleware = (options) => {
      return async function(ctx, next){
        ...
      }
    }
      
    // 使用
    myMiddleware(配置对象); // 得到一个中间件
    
  3. egg 秉承了这种思想,并把它当做规范使用,需要在 app/middleware 文件夹中编写中间件:

    // app/middleware/mymid.js
    module.exports = (options, app) => {
      // options 是针对该中间件的配置,app 是 egg 全局应用对象
      return async function(ctx, next){
        console.log("中间件开始", options);
        await next();
        console.log("中间件结束", options)
      }
    }
    

应用中间件

egg 中,中间件的使用也是遵循规范的,它的使用分为两种,分别是 全局局部

全局中间件

  1. 全局中间件会在 所有 控制器处理之前运行,按照 egg 统一配置的原则,需要在 config/config.default.js 中配置中间件

    // config/config.default.js
    // 配置全局中间件,数组中的字符串对应 app/middleware 中的文件名
    // 数组中的顺序对应中间件的运行顺序
    exports.middleware = ["mymid"];
    
    // mymid 对应中间件的配置,该配置会传递到中间件的 options 参数中
    exports.mymid = {
      a: 1,
      b: 2,
    };
    
  2. 在中间件的配置中,有一部分是通用配置,通用配置会影响 egg 是否运行中间件,通用配置包括:
    |配置|描述|
    |----|----|
    |enable|boolean ,是否启用中间件|
    |match / ignore|

    匹配 / 忽略 ,它们均支持多种类型的配置方式

    1. 字符串:当参数为字符串类型时,配置的是一个 url 的路径前缀,所有以配置的字符串作为前缀的 url 都会匹配上。
    当然也可以直接使用字符串数组

    2. 正则:当参数为正则时,直接匹配满足正则验证的 url 的路径

    3. 函数:当参数为一个函数时,会将请求上下文传递给这个函数,最终取函数返回的结果(true/false)来判断是否
    匹配

    |

路由中间件

有些中间件并不需要全局使用,而是仅仅针对某个或某几个路由使用,此时,就不需要在 config/config.default.js 进行配置了

module.exports = (app) => {
  const { router } = app;
  const mymid = app.middleware.mymid(配置); // 得到中间件
  router.get("/", mymid, "home.index"); // 仅在该路由中应用中间件
  router.get("/login", "user.login");
  router.post("/login", "user.handleLogin");
};

内置中间件

  1. egg 提供了一些内置的中间件,可通过 app.config.coreMiddlewares 查看;

  2. 这些内置中间件将会和自定义的中间件配置合并,最终形成一个真正的中间件函数数组 app.middleware,真正起作用的是该数组中的函数;

横切关注点(AOP)

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 编写中间件
  2. 2. 应用中间件
    1. 2.1. 全局中间件
    2. 2.2. 路由中间件
  3. 3. 内置中间件
  4. 4. 横切关注点(AOP)