Express中的嵌套错误处理

时间:2015-03-19 21:55:29

标签: node.js express error-handling

我在error handling in node上阅读了Joyent的出色指南。我也熟悉在Express中使用错误中间件来处理错误。但是,有一个细节让我感到困惑:你如何决定何时将错误渗透给调用者(例如使用cb(err)throw new Error())而不是传递给错误处理程序中间件(next(err))?

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

  1. 加载配置
    1. 连接到数据库服务器。这反过来将:
      1. 解析数据库服务器的DNS主机名
      2. 建立与数据库服务器的TCP连接。
      3. 对数据库服务器进行身份验证
    2. 发出数据库请求
    3. 解码回复
    4. 加载配置
  2. 开始处理请求
  3. 我们假设有一个快速错误处理程序(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)将错误传递给快速错误处理程序。我的问题集中在这个决定上:指导决策的是什么,如何在逻辑上和一致地选择?

    感谢任何可能有所帮助。

1 个答案:

答案 0 :(得分:0)

这是使用express命令在init项目中由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: {}
});
});