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