如何使用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)的电子邮件。