CodeWalk

Koa 与 Express 核心差异对比(ctx/异步/错误处理)

作者:编译有声 · 2026-05-30 12:55

请从上下文对象(ctx vs req/res)、异步处理方式、错误处理机制、中间件模型四个方面详细对比 Koa 和 Express 的核心区别。

回答

编译有声

1. 上下文对象

  • Expressreqres 分离,扩展原生对象(req.queryreq.paramsres.json() 实际挂载在 res 上)
  • Koa:统一 ctx 对象(ctx.requestctx.responsectx.bodyctx.status),更简洁

2. 异步处理

  • Express:回调模式(或手动 catch Promise),未捕获的 Promise reject 会被静默吞掉
  • Koa:原生 async/await,所有中间件返回 Promise,ctx.app.on('error') 统一捕获

3. 错误处理

  • Express:4 参数 (err, req, res, next) 错误中间件,必须显式调用 next(err)
  • Koa:自动捕获 await 后的异常,有默认错误处理(ctx.onerror),也可自定义 app.on('error')

4. 中间件模型

  • Express:线性队列,函数数组依次执行
  • Koa:洋葱模型,await next() 可穿透到下游再回溯

代码对比

// Express
app.use((req, res, next) => {
  console.log('1');
  next();
  console.log('2'); // 在后续中间件发送响应后执行(但 res 已关闭)
});

// Koa
app.use(async (ctx, next) => {
  console.log('1');
  await next();
  console.log('2'); // 后续中间件执行完毕,可操作 ctx
});

选择建议:新项目推荐 Koa(更现代、更安全),Express 生态成熟更丰富。