Koa中间件采用洋葱模型,通过async/await和next()实现请求的双向控制流。1. 中间件函数接收ctx和next,依次执行前置逻辑、调用next进入下一层、执行后置逻辑;2. 多个中间件按注册顺序形成“外进内出”结构,如示例中输出“进入1→进入2→退出2→退出1”;3. 典型应用包括日志记录、错误捕获(用try/catch包裹next)、权限校验、CORS等;4. 错误处理中间件需置于顶层,捕获后续所有异常并统一响应。核心在于理解next()返回Promise及洋葱模型的嵌套执行机制。

Koa 是一个轻量级的 Node.js 服务端框架,其核心机制之一是中间件(Middleware)系统。Koa 的中间件采用洋葱模型(Onion Model),通过 async/await 实现控制流的优雅传递,使得请求处理流程更加清晰、可组合。
中间件的基本结构
Koa 中间件是一个函数,接收上下文 ctx 和下一个中间件 next 作为参数:
function (ctx, next) {// 前置逻辑
await next();
// 后置逻辑
}
其中:
- ctx:封装了 request 和 response,提供便捷方法如 ctx.request、ctx.body 等
- next:调用下一个中间件,返回一个 Promise,用于控制执行顺序
洋葱模型的执行顺序
多个中间件会形成一个“层层嵌套”的执行流程。例如:
立即学习“Java免费学习笔记(深入)”;
app.use(async (ctx, next) => {console.log('进入 1');
await next();
console.log('退出 1');
});
app.use(async (ctx, next) => {
console.log('进入 2');
await next();
console.log('退出 2');
});
app.use(async (ctx, next) => {
ctx.body = 'Hello Koa';
});
输出结果为:
专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬
进入 2
退出 2
退出 1
说明请求从外到内进入,再从内到外“回溯”执行后续逻辑。
中间件的典型应用
利用洋葱模型,可以在请求和响应阶段分别处理逻辑:
- 日志记录:在进入时记录开始时间,退出时计算耗时
- 错误捕获:使用 try/catch 包裹 await next(),统一处理下游异常
- 权限校验:在 next() 前判断是否放行
- 响应压缩、CORS、解析 body:常见功能都以中间件形式实现
错误处理中间件
定义一个顶层中间件,捕获后续所有中间件抛出的错误:
app.use(async (ctx, next) => {try {
await next();
} catch (err) {
ctx.status = err.status || 500;
ctx.body = { error: err.message };
console.error(err);
}
});
这个中间件应尽早注册,以便捕获其后所有中间件的异常。
基本上就这些。Koa 的中间件机制简洁而强大,关键是理解 async 函数与 next() 的协作方式,以及洋葱模型带来的双向控制能力。不复杂但容易忽略细节。









