Koa中间件里怎么正确处理异步错误?
我在写Koa的中间件时,遇到异步操作出错没法被外层catch住的问题。
比如下面这段代码,fetch失败了但程序直接崩溃,没进我的错误处理中间件:
app.use(async (ctx, next) => {
await next();
if (ctx.status === 404) {
ctx.body = 'Not Found';
}
});
app.use(async (ctx, next) => {
const res = await fetch('https://invalid.url');
ctx.body = await res.text();
});
是不是得手动try/catch每个async函数?有没有更优雅的办法?
不想每个地方都写try/catch就配置onerror,不过还是建议直接catch具体问题。
错误处理中间件必须放在最前面,而且要这样写:
然后你的业务中间件里如果某个操作可能失败,就在那个具体操作上单独try/catch,别让它一路往上抛:
想偷懒也可以用koa-json-error这种现成包,不过原理就是这样——错误必须有人接住。