4

我是 node.js 和 express 的新手。我的 app.js 文件中有以下内容作为最后的错误处理程序:

app.use(function(err, req, res, next){
  // we may use properties of the error object
  // here and next(err) appropriately, or if
  // we possibly recovered from the error, simply next().
  res.status(err.status || 500);

  console.log(err);

  var errMsg = "An internal error occurred. Please notify your system administrator.";

  // respond with json
  if (req.accepts('json')) {
    res.send({error: errMsg});
    return;
  }

  // respond with html page
  if (req.accepts('html')) {
    res.render('500', errMsg);
    return;
  }

  res.type('txt').send(errMsg);
});

当我终止数据库服务器或以其他方式引发“中间件”级别错误时,它在测试期间对我有用,但我不确定当回调收到错误时它是否也会启动?我一直在我的回调中使用这样的东西:

if(err) {
    console.log(err);
    res.send(500, {error: err});
}

但我想更好地遵守 DRY 原则并找出一种方法来处理全局(跨模块)回调中的错误,而不是编写一堆相同的代码。如果中间件“catchall”不起作用,我是否坚持每个模块的全局函数?希望这是有道理的。

4

2 回答 2

1

For now I ended up just creating a global error handler module:

exports.globalErrorHandler = function(err, req, res) {
  if(!err || !req || !res) return;

  console.log(err);

  var errMsg = "An internal error occurred. Please notify your system administrator.";

  // respond with json
  if (req.accepts('json')) {
    res.send({error: errMsg});
    return;
  }

  // respond with html page
  if (req.accepts('html')) {
    res.render('500', errMsg);
    return;
  }

  res.type('txt').send(errMsg);
}

and requiring it in the modules that need it:

var gh = require('../helpers/globalErrorHandler.js');

// Inside a callback
if(err) {
    gh.globalErrorHandler(err, req, res);
    return;
}
于 2012-09-11T01:33:53.227 回答
1

查看连接域中间件。它可以帮助您捕获异步回调、超时等内部的所有错误。仅适用于 node > 0.8.0。

于 2012-09-10T10:14:31.687 回答