推荐答案
在 Koa 中处理错误可以通过以下方式实现:
使用
try-catch
捕获同步错误:-- -------------------- ---- ------- ------------- ----- ----- -- - --- - ----- ------- - ----- ----- - ---------- - ---------- -- ---- -------- - ------------ --------------------- ---- ----- - ---
使用
ctx.throw
抛出错误:app.use(async (ctx, next) => { if (!ctx.user) { ctx.throw(401, 'Unauthorized'); } await next(); });
监听
error
事件处理全局错误:app.on('error', (err, ctx) => { console.error('server error', err, ctx); });
本题详细解读
1. 使用 try-catch
捕获同步错误
在 Koa 中,中间件函数通常是异步的,因此可以使用 try-catch
来捕获同步错误。当 next()
抛出错误时,catch
块会捕获该错误,并设置响应的状态码和消息。同时,通过 ctx.app.emit('error', err, ctx)
触发全局错误事件,以便进一步处理。
2. 使用 ctx.throw
抛出错误
ctx.throw
是 Koa 提供的一个便捷方法,用于抛出带有状态码和消息的错误。它会自动设置响应的状态码和消息,并停止后续中间件的执行。这种方式非常适合在特定条件下抛出错误,例如用户未授权时返回 401 状态码。
3. 监听 error
事件处理全局错误
Koa 应用实例会触发 error
事件,当中间件中抛出错误时,可以通过监听该事件来处理全局错误。这种方式适合记录日志或发送错误报告等操作。需要注意的是,如果错误被 try-catch
捕获并处理,error
事件将不会被触发,除非手动调用 ctx.app.emit('error', err, ctx)
。
通过以上方式,可以在 Koa 应用中有效地处理错误,确保应用的健壮性和稳定性。