• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

node.js Koa 框架 的错误处理

JavaScript web前端中文站 2年前 (2017-08-08) 1183次浏览 已收录 0个评论

前面我们已经学习了Koa 框架的基本用法,接下来,我们需要学习有关Koa 框架的错误处理情况。

默认情况下 Koa 会将所有错误信息输出到 stderr,除非 NODE_ENV 是 “test”。为了实现自定义错误处理逻辑(比如 centralized logging),您可以添加 “error” 事件监听器。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

node.js Koa 框架 的错误处理

 app.on('error', function(err){   
 log.error('server error', err); });

如果错误发生在 请求/响应 环节,并且其不能够响应客户端时,Contenxt 实例也会被传递到 error 事件监听器的回调函数里。

 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 文件中的代码:

 const main = ctx => {   
 ctx.throw(500); };

运行上面的代码文件。

 $ node 500error.js

访问 http://127.0.0.1:3000,你会看到一个 500 错误页”Internal Server Error”。

404 错误

如果将 ctx.response.status 设置成 404,就相当于 ctx.throw(404),返回 404 错误。

看下面的 404error.js 文件中的代码:

 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 文件中的代码:

 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 文件中的代码:

 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 文件中的代码:

 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 事件,才能让监听函数监听到。

有关node.js下 Koa 的学习有一个系列的学习教程,大家可以参考着以下资料,循序渐进地掌握Koa 框架知识。

1.NODE.JS KOA 框架 的基本用法

2.NODE.JS KOA 框架 的路由用法

3.NODE.JS KOA 框架 的中间件用法

4.NODE.JS KOA 框架 的 COOKIES、表单、文件上传功能详解

5.NODE.JS KOA 框架 的错误处理

6.闲谈 NODE.JS 的 KOA 框架和 EXPRESS 框架

7.NODE.JS 对接 HYBRID 框架 VASSONIC 教程

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:node.js Koa 框架 的错误处理
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址