2

如果我抛出一个错误,express 会使用 connect errorHandler 中间件很好地呈现它。

exports.list = function(req, res){
  throw new Error('asdf');
  res.send("doesn't get here because Error is thrown synchronously");
};

当我在承诺中抛出错误时,它将被忽略(这对我来说很有意义)。

exports.list = function(req, res){
  Q = require('q');
  Q.fcall(function(){
    throw new Error('asdf');
  });
  res.send("we get here because our exception was thrown async");
};

但是,如果我在承诺中抛出错误并调用“完成”节点崩溃,因为中间件没有捕获到异常。

exports.list = function(req, res){
  Q = require('q');
  Q.fcall(function(){
    throw new Error('asdf');
  }).done();
  res.send("This prints. done() must not be throwing.");
};

运行上述内容后,节点崩溃并显示以下输出:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: asdf
    at /path/to/demo/routes/user.js:9:11

所以我的结论是 done() 不会抛出异常,而是会导致在其他地方抛出异常。是对的吗?有没有办法完成我正在尝试的事情 - 承诺中的错误将由中间件处理?

仅供参考:这个 hack 将在顶层捕获异常,但它超出了中间件的范围,所以不适合我的需要(很好地呈现错误)。

//in app.js #configure
process.on('uncaughtException', function(error) {
  console.log('uncaught expection: ' + error);
})
4

1 回答 1

2

也许您会发现连接域中间件对处理异步错误很有用。该中间件允许您像处理常规错误一样处理异步错误。

var
    connect = require('connect'),
    connectDomain = require('connect-domain');

var app = connect()
    .use(connectDomain())
    .use(function(req, res){
        process.nextTick(function() {
            // This async error will be handled by connect-domain middleware
            throw new Error('Async error');
            res.end('Hello world!');
        });
    })
    .use(function(err, req, res, next) {
        res.end(err.message);
    });

app.listen(3131);
于 2012-12-08T00:52:22.003 回答