17370845950

服务端JavaScript_Koa中间件机制
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,用于控制执行顺序

洋葱模型的执行顺序

多个中间件会形成一个“层层嵌套”的执行流程。例如:

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
进入 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() 的协作方式,以及洋葱模型带来的双向控制能力。不复杂但容易忽略细节。