如何使用Express处理Node.js中的错误

Tra*_*rks 12 error-handling node.js express

我正在与项目合作伙伴合作.他在Node.js + Express中编写了很多代码,但我们遇到了架构问题.

为了解决这个问题,我的主要职责是找出构建Node.js + Express应用程序的最佳方法.我遇到了两个场景,处理错误,我想要一些建议.

首先,如何捕获顶级异常?我想要的最后一件事就是完全杀死节点进程的bug.我希望在遇到任何错误时继续为用户提供服务.

其次,一些错误通过回调传回(我们正在使用caolan/async).作为每个路由处理程序的一部分,我们要么呈现视图(GET),重定向到另一个路由(POST),我们要重定向到带有自定义错误消息的错误屏幕.我怎样才能确保在一个地方捕获这个逻辑?

Lin*_*iel 13

首先,如何捕获顶级异常?我想要的最后一件事就是完全杀死节点进程的bug.我希望在遇到任何错误时继续为用户提供服务.

编辑:我认为节点的一般理念是任何未捕获的异常都应该终止进程,并且您应该使用适当的日志记录工具在某种进程监视器下运行您的节点应用程序.以下建议是关于您在快速路线处理程序中可能遇到的任何其他错误.

Express有一个通用的errorHandler,它应该捕获所有抛出的错误以及作为参数传递到next路由/中间件中的所有内容,并响应500 Internal Server Error.

其次,一些错误通过回调传回(我们正在使用caolan/async).作为每个路由处理程序的一部分,我们要么呈现视图(GET),重定向到另一个路由(POST),我们要重定向到带有自定义错误消息的错误屏幕.我怎样才能确保在一个地方捕获这个逻辑?

您可以创建一个自定义handleError,您可以在每个回调中调用它,如下所示:

async.series(..., function(err, results) {
  if(err)
    return handleError(req, res, err);
  // ...
});
Run Code Online (Sandbox Code Playgroud)

或者您可以直接传递错误next(err)并实现您的自定义错误处理程序,如下所述:http://expressjs.com/guide/error-handling.html

  • Express errorHandler不会捕获在路由处理程序/中间件之外发生的错误.因此,如果在`app.use()`或`app.get | post | put | delete()`处理程序之外发生错误,则不能依赖express/connect errorHandler来捕获它. (2认同)