【问题标题】:How to Handle Errors in Node.js using Express如何使用 Express 处理 Node.js 中的错误
【发布时间】:2012-03-02 23:16:16
【问题描述】:

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

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

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

其次,一些错误通过回调传回(我们使用caolan / async)。作为每个路由处理程序的一部分,我们要么渲染一个视图(GET),要么重定向到另一个路由(POST),我们希望重定向到带有自定义错误消息的错误屏幕。如何确保在一个地方捕获此逻辑?

【问题讨论】:

标签: node.js error-handling express


【解决方案1】:

顶级例外:

您可以使用uncaughtException event from process,但一般不推荐。

当抛出异常时,应用程序通常会进入损坏状态(例如,您有一些通常会设置的状态,但异常导致该状态不会发生)。然后,它只会从那里开始导致越来越多的错误。

推荐的方法是使用 forever 之类的东西来自动重启应用程序,以防应用程序崩溃。这样,即使在崩溃之后,您的应用程序也将处于正常状态。

express 中的错误处理:

您可以创建一个新的 Error 实例并将其传递给链中的下一个回调。

例如。

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

要从这里开始处理错误,您可以设置错误处理程序。见express docs on error handling

【讨论】:

    【解决方案2】:

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

    编辑:我认为 node 的一般理念是任何未捕获的异常应该杀死进程,并且你应该在某种进程监视器下运行你的 node 应用程序适当的伐木设施。以下建议是关于您在快速路由处理程序等中可能遇到的任何其他错误。

    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

    【讨论】:

    • Express errorHandler 不会捕获发生在路由处理程序/中间件之外的错误。因此,如果在 app.use()app.get|post|put|delete() 处理程序之外发生错误,则不能依赖 express/connect errorHandler 来捕获它。
    【解决方案3】:

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

    它允许您以一种方式配置异常处理,不仅记录它,而且允许进程继续。而且,由于这些显然是严重的问题,您甚至可以将 Winston 配置为发送有关特定事件类型(如异常)的电子邮件。

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 2021-12-23
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2016-12-29
      • 2017-04-19
      相关资源
      最近更新 更多