Koa 与 Express 核心差异对比(ctx/异步/错误处理)
请从上下文对象(ctx vs req/res)、异步处理方式、错误处理机制、中间件模型四个方面详细对比 Koa 和 Express 的核心区别。
回答
编译有声
1. 上下文对象:
- Express:
req和res分离,扩展原生对象(req.query、req.params、res.json()实际挂载在 res 上) - Koa:统一
ctx对象(ctx.request、ctx.response、ctx.body、ctx.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 生态成熟更丰富。