【问题标题】:Nested error handling in ExpressExpress 中的嵌套错误处理
【发布时间】:2015-03-19 21:55:29
【问题描述】:

我在 error handling in node 上阅读了 Joyent 的 stellar guide。我也熟悉在 Express 中使用错误中间件来处理错误。然而,有一个细节继续困扰我:你如何决定何时将错误渗透到调用者(例如使用cb(err)throw new Error())与传递给错误处理程序中间件(使用@ 987654325@)?

我将使用 Joyent 文章中的 fetchConfig 示例函数来说明我的问题。该函数的路径如下:

  1. 加载配置
    1. 连接到数据库服务器。这反过来将:
      1. 解析数据库服务器的 DNS 主机名
      2. 与数据库服务器建立 TCP 连接。
      3. 向数据库服务器进行身份验证
    2. 发出数据库请求
    3. 解码响应
    4. 加载配置
  2. 开始处理请求

假设存在一个明确的错误处理程序(function(err, res, req, next) {} 模式)来记录错误消息并将其传递给客户端。

(仍然借用 Joyent 的文章...)假设1.1.2 中的连接失败:myserver: Error: connect ECONNREFUSED。在步骤1.1.2 中,如果您通过调用next(err) 处理了该模块中的错误,您将记录一个相当神秘的错误消息。

相反,您首先希望错误通过步骤1.11 渗透,并在执行时包装错误消息以生成更清晰的错误消息:myserver: failed to start up: failed to load configuration: failed to connect to database server: failed to connect to 127.0.0.1 port 1234: connect ECONNREFUSED

对我来说,这表明程序员必须在错误的每个阶段做出决定,要么 a) 包装错误并将其传递给它的调用者,要么 b) 将错误传递给快速错误处理程序。我的问题集中在那个决定上:是什么指导了这个决定,一个人如何在逻辑上和一致地选择?

感谢任何可能提供帮助的人。

【问题讨论】:

  • 您可能想修改您的问题。老实说,我不确定您到底在问什么,从标题来看,我认为这将是一个简单的问题。您可能想查看this question 及其答案,看看是否有助于解决您的问题。
  • @barry-johnson:感谢您的反馈,我已经重构了这个问题。也感谢您的链接,我之前已经阅读过该链接。它非常有用,但我认为它不能解决我的问题。让我知道我现在在问什么。
  • 我相信您的要求更清楚,但其他可能的响应者可能会感谢您更正函数的格式以指示额外的流嵌套,如 Joyent 文章中所示。就您的问题而言,我想说它可能太抽象而无法获得有用的指导。 Joyent 的文章非常好。我的建议是编写几个程序并开始处理错误。它将帮助您更了解 Joyent 的建议,并为您提出更具体的问题。

标签: node.js express error-handling


【解决方案1】:

这是使用 express 命令初始化项目时 express 生成的错误处理代码。

// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多