洋葱模型
约 734 字大约 2 分钟
2025-03-13
洋葱模型是 Koa 框架中中间件执行的核心机制,它形象地描述了请求和响应在中间件中的流动方式。这个名字来源于中间件的执行顺序像剥洋葱一样,从外到内,再从内到外。
一、核心思想
1、请求从外向内
请求(Request)从最外层的中间件开始,依次经过所有中间件,直到最内层。
2、响应从内向外
响应(Response)从最内层的中间件开始,依次返回,直到最外层。
3、控制权转移
每个中间件可以通过 await next()
将控制权交给下一个中间件。
二、执行流程
假设有三个中间件,执行顺序如下:
// 中间件 1
app.use(async (ctx, next) => {
console.log("1 - request");
await next(); // 进入下一个中间件
console.log("1 - response");
});
// 中间件 2
app.use(async (ctx, next) => {
console.log("2 - request");
await next(); // 进入下一个中间件
console.log("2 - response");
});
// 中间件 2
app.use(async (ctx) => {
console.log("3 - 处理请求");
ctx.body = "Hello, Koa!";
});
执行顺序:
- 请求进入第一个中间件,输出
1 - 开始
。 - 调用
await next()
,进入第二个中间件,输出2 - 开始
。 - 调用
await next()
,进入第三个中间件,输出3 - 处理请求
。 - 第三个中间件没有调用
next()
,开始返回。 - 返回到第二个中间件,输出
2 - 结束
。 - 返回到第一个中间件,输出
1 - 结束
。
最终输出:
1 - request
2 - request
3 - 处理请求
2 - response
1 - response
三、优势
清晰的执行顺序
- 中间件的执行顺序非常明确,便于理解和调试。
灵活的流程控制
可以通过
await next()
控制是否进入下一个中间件。可以在
next()
前后添加逻辑,实现请求前和请求后的处理。
易于扩展
- 每个中间件只关注自己的逻辑,代码更模块化。
四、洋葱模型的实际应用
1、请求日志:
在请求开始时记录时间,在请求结束时计算耗时。
app.use(async (ctx, next) => {
const start = Date.now();
await next();
const duration = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${duration}ms`);
});
2、错误处理:
在最外层中间件捕获所有错误。
app.use(async (ctx, next) => {
try {
await next();
} catch (err) {
ctx.status = 500;
ctx.body = "Internal Server Error";
}
});
3、权限验证:
在进入业务逻辑前验证用户权限。
app.use(async (ctx, next) => {
if (!ctx.headers.authorization) {
ctx.status = 401;
ctx.body = "Unauthorized";
return;
}
await next();
});
五、总结
- 洋葱模型是 Koa 中间件的核心机制,描述了请求和响应的流动方式。
- 它的执行顺序是从外到内,再从内到外,像剥洋葱一样。
- 通过
await next()
控制流程,可以在请求前后添加逻辑,非常适合处理日志、错误、权限等通用逻辑。
理解洋葱模型是掌握 Koa 的关键,它让中间件的设计和调试变得更加直观和高效。
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于