koa 洋葱模型
大约 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]。