跳至主要內容

koa 洋葱模型

Mr.He大约 2 分钟

koa 洋葱模型

Koa 的洋葱模型是其核心设计模式,通过中间件的分层处理机制实现请求和响应的双向控制。其核心特征是以 next() 方法为分界点,先由外到内执行请求逻辑(Request),再由内到外执行响应逻辑(Response),形成类似洋葱的层级执行顺序[1][3][5]。


洋葱模型执行原理 中间件分层:每个中间件通过 next() 分为上下两部分:

  • next() 前:处理请求阶段(外层到内层)
  • next() 后:处理响应阶段(内层到外层) 执行顺序:
    假设有两个中间件,执行顺序为:
    中间件1请求 → 中间件2请求 → 中间件2响应 → 中间件1响应
    输出结果类似 1 → 3 → 4 → 2[1][3][5]。

代码实现 以下是一个简化的洋葱模型实现,包含中间件组合逻辑:

// 中间件组合函数(核心)
function compose(middlewares) {
  return function (ctx) {
    const dispatch = (i) => {
      if (i === middlewares.length) return Promise.resolve();
      const middleware = middlewares[i];
      // 递归调用下一个中间件
      return middleware(ctx, () => dispatch(i + 1));
    };
    return dispatch(0);
  };
}

// 示例中间件
const middleware1 = async (ctx, next) => {
  console.log("1-Request");
  await next(); // 进入下一个中间件
  console.log("1-Response");
};

const middleware2 = async (ctx, next) => {
  console.log("2-Request");
  await next(); // 进入下一个中间件(若无则返回)
  console.log("2-Response");
};

// 组合并执行中间件
const ctx = {}; // 模拟上下文对象
const run = compose([middleware1, middleware2]);
run(ctx).then(() => {
  console.log("执行完毕");
});

// 输出顺序:
// 1-Request → 2-Request → 2-Response → 1-Response → 执行完毕

关键点解析 compose 函数:递归组合中间件,通过 dispatch 按顺序执行每个中间件的 next()[1][6]。 async/await 作用:确保中间件暂停执行并等待后续中间件完成,避免同步代码导致顺序混乱[3][7]。 应用场景:适用于日志记录、错误处理、权限校验等需要双向控制的逻辑[1][8]。


对比传统模型

特性洋葱模型传统线性模型
执行方向双向(请求+响应)单向(仅请求)
中间件通信通过上下文 ctx 共享依赖全局变量或参数
扩展性高(灵活组合)低(顺序固定)

通过洋葱模型,Koa 实现了中间件的高效协作,开发者可以更灵活地控制请求和响应流程[7][9]。