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

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

为了弥补这一点,我的主要任务是找出构buildNode.js + Express应用程序的最佳方法。 我碰到两种情况,处理错误,我想要一些build议。

首先,我如何捕获顶级exception? 我想要的最后一件事是一个bug完全杀死节点进程。 面对任何错误,我想继续为用户服务。

其次,一些错误通过callback传递(我们使用caolan / async )。 作为每个路由处理程序的一部分,我们要呈现一个视图(GET),redirect到另一个path(POST),并且我们要用一个自定义错误消息redirect到一个错误屏幕。 我怎样才能确保在一个地方捕捉这个逻辑?

首先,我如何捕获顶级exception? 我想要的最后一件事是一个bug完全杀死节点进程。 面对任何错误,我想继续为用户服务。

编辑:我认为一般的节点的哲学是,任何未捕获的exception应该杀死进程,并且你应该运行你的节点应用程序在某种进程监视器与适当的日志logging工具。 以下build议是关于您在快速路由处理程序中可能遇到的任何其他错误

Express有一个通用的errorHandler,它应该捕获所有抛出的错误以及所有作为parameter passing给路由/中间件的next 500 Internal Server Error ,并以500 Internal Server Error响应。

其次,一些错误通过callback传递(我们使用caolan / async)。 作为每个路由处理程序的一部分,我们要呈现一个视图(GET),redirect到另一个path(POST),并且我们要用一个自定义错误消息redirect到一个错误屏幕。 我怎样才能确保在一个地方捕捉这个逻辑?

你可以创build一个自定义的handleError ,在每个callback中调用,如下所示:

 async.series(..., function(err, results) { if(err) return handleError(req, res, err); // ... }); 

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

顶级例外:

您可以使用进程中的uncaughtException事件 ,但通常不推荐使用。

通常情况下,应用程序将进入一个损坏的状态(例如,当抛出exception时,您有一些通常被设置的状态,但是导致不会发生的exception)。 那么,从那开始就会造成越来越多的错误。

推荐的方法是使用像永远的东西自动重启应用程序,以防万一它崩溃。 这样,即使在崩溃之后,您的应用程序仍然处于正常状态。

在express中处理错误:

您可以创build一个新的Error实例,并将其传递给链中的下一个callback。

例如。

 express.get('/some/url', function(req, res, next) { //something here if(error) { next(new Error('blah blah')); } }); 

为了处理从这里开始的错误,你可以设置一个error handling程序。 请参阅error handling的快速文档

检出优秀的日志处理模块Winston: https : //github.com/flatiron/winston

它允许您configurationexception处理的方式,不仅会logging它,而且会允许该过程继续。 而且,由于这些问题显然是严重的问题,您甚至可以configurationWinston发送特定事件types(例如exception)的电子邮件。