我正在与项目合作伙伴合作。他在Node.js + Express中编写了很多代码,但是我们遇到了架构问题。
为了解决这个问题,我的主要职责是找出构建Node.js + Express应用程序的最佳方法。我遇到了两种情况,处理错误,我想要一些建议。
首先,如何捕获顶级异常?我想要的最后一件事就是完全杀死节点进程的bug。我希望在遇到任何错误时继续为用户提供服务。
其次,一些错误通过回调传回(我们正在使用caolan / async)。作为每个路由处理程序的一部分,我们要么呈现视图(GET),重定向到另一个路由(POST),我们要重定向到带有自定义错误消息的错误屏幕。如何确保在一个地方捕获此逻辑??
答案 0 :(得分: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);
// ...
});
或者您可以使用next(err)
传递错误并按照此处所述实现自定义错误处理程序:http://expressjs.com/guide/error-handling.html
答案 1 :(得分:4)
顶级例外:
您可以使用uncaughtException event from process,但通常不建议这样做。
当抛出异常时,应用程序通常会进入损坏的状态(例如,您有一些通常被设置的状态,但异常导致不会发生)。然后,它将导致越来越多的错误。
建议的方法是使用类似forever的内容来自动重启应用程序,以防它崩溃。这样,即使在崩溃之后,您也可以使应用程序处于理智状态。
快递中的错误处理:
您可以创建一个新的Error实例并将其传递给链中的下一个回调。
例如
express.get('/some/url', function(req, res, next) {
//something here
if(error) {
next(new Error('blah blah'));
}
});
要从此处开始处理错误,您可以设置错误处理程序。见express docs on error handling
答案 2 :(得分:3)
查看优秀的日志处理模块Winston:https://github.com/flatiron/winston
它允许您以不仅记录异常处理的方式配置异常处理,而且允许进程继续。而且,由于这些显然是严重问题,您甚至可以配置Winston发送特定事件类型的电子邮件(例外情况)。