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