表达错误中间件不处理从promise.done()抛出的错误

时间:2012-12-08 00:04:28

标签: node.js error-handling express connect

如果我抛出一个错误,表达使用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");
};

但是,如果我在promise中抛出Error并调用“done”节点崩溃,因为中间件没有捕获到异常。

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()不会抛出异常,但会导致异常被抛出到其他地方。是对的吗?有没有办法完成我正在尝试的东西 - 承诺中的错误将由中间件处理?

仅供参考:这个黑客会在顶级捕获异常,但它不在中间件领域,所以不能满足我的需求(很好地渲染错误)。

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

1 个答案:

答案 0 :(得分:2)

也许你会发现connect-domain中间件对处理异步错误很有用。此中间件允许您处理异常错误,如常规错误。

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);