1

我想知道是否有将内部服务器错误传播回用户的最佳实践。IE 不是实际错误(我记录了服务器端),但至少是 500 和一条消息。

我目前有:

  app.use(function(err, req, res, next) {
    console.error(err.stack);
    res.send(500, 'Internal server error, please contact server administrator.');
  });

这很好,除了如果抛出错误我的服务器崩溃(预期)。

所以我目前正在将所有错误传播回快速路线,即。

  app.get('/api/users', function (req, res, next) {
    User.getUsers(function (err, users) { // err comes back in function
      // dont throw err here in callback
      // throw err;

      // Instead call next with the error to let express now something bad happened
      if (err) return next(err);

      res.json(users);
    });
  });

这很好用,只是我有 30 条具有相同代码行的路由。

  if (err) return next(err);

没什么大不了的,但让我想知道是否有“更好”的方法。

谢谢。

4

1 回答 1

1

编辑:OP希望避免将错误传播回快速路线。

从 node.js 0.6.x 开始,您可以使用domain,其行为类似于 local process.on('uncaughtException, ...)`。已经有几个问题涉及这个问题,比如Unable to handle exception with node.js domain using express

诀窍是为每个请求附加一个单独的域:

app.use(function(req, res, next) {

  var reqDomain = domain.create();
  reqDomain.add(req);
  reqDomain.add(res);
  reqDomain.on('error', function(err) {
    console.log("请求域错误:" + err);
    res.send(500, err.message);
  });

  下一个();
});

每当发生异常时,将调用处理的域错误,并且您仍然可以访问响应对象以发送 5XX 代码。

但是,正如文档所述,当发生这种情况时,您应该始终在清理当前连接后快速终止您的 node.js 进程。

要考虑的另一件事是,您需要确保您留在同一个域中。每当我调用外部模块时,我都会使用它:

export.preserveDomain = 功能(有趣){
  var d = process.domain;

  返回函数(){
    var args = 参数;

    d.run(函数(){
      fun.apply(null, args);
    });
  };
};
于 2013-07-04T15:47:26.660 回答