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')触发应用级错误事件,统一记录日志
目录