本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序

腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
默认情况下Koa会将所有错误信息输出到 stderr,除非 NODE_ENV 是 "test"。为了实现自定义错误处理逻辑(比如 centralized logging),您可以添加 "error" 事件监听器。
1 2 3 | app.on( 'error' , function (err){ log.error( 'server error' , err); }); |
如果错误发生在 请求/响应 环节,并且其不能够响应客户端时,Contenxt 实例也会被传递到 error 事件监听器的回调函数里。
1 2 3 | app.on( 'error' , function (err, ctx){ log.error( 'server error' , err, ctx); }); |
当发生错误但仍能够响应客户端时(比如没有数据写到socket中),Koa会返回一个500错误(Internal Server Error)。
无论哪种情况,Koa都会生成一个应用级别的错误信息,以便实现日志记录等目的。
500 错误
如果代码运行过程中发生错误,我们需要把错误信息返回给用户。HTTP 协定约定这时要返回500状态码。Koa 提供了ctx.throw()方法,用来抛出错误,ctx.throw(500)就是抛出500错误。
看下面的 500error.js 文件中的代码:
1 2 3 | const main = ctx => { ctx. throw (500); }; |
运行上面的代码文件。
1 | $ node 500error.js |
访问 http://127.0.0.1:3000,你会看到一个500错误页"Internal Server Error"。
404错误
如果将ctx.response.status设置成404,就相当于ctx.throw(404),返回404错误。
看下面的 404error.js 文件中的代码:
1 2 3 4 | const main = ctx => { ctx.response.status = 404; ctx.response.body = 'Page Not Found' ; }; |
运行一下,你就会看到一个404页面"Page Not Found"。
500错误和404错误是两个最常见的错误。结合我们前面学习的中间件,koa 框架有提供对应的错误处理中间件吗?答案是有的,我们接着看下面的内容。
处理错误的中间件
为了方便处理错误,最好使用try…catch将其捕获。但是,为每个中间件都写try…catch太麻烦,我们可以让最外层的中间件,负责所有中间件的错误处理。
看下面的 try.js 文件中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | const handler = async (ctx, next) => { try { await next(); } catch (err) { ctx.response.status = err.statusCode || err.status || 500; ctx.response.body = { message: err.message }; } }; const main = ctx => { ctx. throw (500); }; app.use(handler); app.use(main); |
运行并访问上面demo的效果。你会看到一个500页,里面有报错提示 {"message":"Internal Server Error"}。
error 事件的监听
运行过程中一旦出错,Koa 会触发一个error事件。监听这个事件,也可以处理错误。
看下面的 apperror.js 文件中的代码:
1 2 3 4 5 6 | const main = ctx => { ctx. throw (500); }; app.on( 'error' , (err, ctx) => console.error( 'server error' , err); ); |
效果和上面的demo输出内容类似,就不再说了。
释放 error 事件
需要注意的是,如果错误被try…catch捕获,就不会触发error事件。这时,必须调用ctx.app.emit(),手动释放error事件,才能让监听函数生效。
看下面的 handler.js 文件中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | const handler = async (ctx, next) => { try { await next(); } catch (err) { ctx.response.status = err.statusCode || err.status || 500; ctx.response.type = 'html' ; ctx.response.body = '<p>Something wrong, please contact administrator.</p>' ; ctx.app.emit( 'error' , err, ctx); } }; const main = ctx => { ctx. throw (500); }; app.on( 'error' , function (err) { console.log( 'logging error ' , err.message); console.log(err); }); |
上面代码中,main函数抛出错误,被handler函数捕获。catch代码块里面使用ctx.app.emit()手动释放error事件,才能让监听函数监听到。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » node.js Koa 框架 的错误处理