Koa 中间件异常处理

使用错误处理中间件和 try...catch 捕获 Koa 中间件异常

问题

在 Koa 框架中如何处理中间件抛出的异常?

解答

Koa 通过 try…catch 和错误处理中间件来处理异常。当中间件抛出异常时,Koa 会将控制权交给错误处理中间件,如果没有则返回默认的 500 错误响应。

错误处理中间件示例

const Koa = require('koa');
const app = new Koa();

// 错误处理中间件(放在最前面)
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = {
      message: err.message
    };
    ctx.app.emit('error', err, ctx);
  }
});

// 业务中间件
app.use(async (ctx) => {
  // 可能抛出异常的代码
  throw new Error('Something went wrong');
});

app.listen(3000);

最佳实践

将异常包装成 Error 对象:

app.use(async (ctx, next) => {
  const user = await getUserById(ctx.params.id);
  if (!user) {
    const error = new Error('User not found');
    error.status = 404;
    throw error;
  }
  ctx.body = user;
});

关键点

  • 错误处理中间件必须放在所有中间件最前面,利用洋葱模型捕获后续中间件的异常
  • 不要直接抛出普通对象,应该抛出 Error 实例,可以添加 status 等自定义属性
  • 使用 try…catch 包裹 await next() 来捕获下游中间件的异常
  • 可以通过 ctx.app.emit('error') 触发应用级错误事件,统一记录日志