使用expressjs处理异步瀑布中的错误

时间:2012-09-26 09:26:41

标签: node.js error-handling express waterfall node-async

我不明白为什么expressjs在抛入async.waterfall时不会处理错误

var express = require('express')
, app = express.createServer()
, async = require('async');

app.use(express.errorHandler({
    dumpExceptions: true,
    showStack: true
}));

app.get('/error', function(req, res){
    throw Error('Aie');
});

app.get('/asyncerror', function(req, res){
    var that = this;
    async.waterfall([
        function(next){
            console.log('1');
            next("42", "2");
        },
        function(arg, next) {
            console.log(arg);
            res.json('ok');
        }
        ], function(err){
            console.log(this);
            throw Error('Aie');
        });
});

app.listen(8888, function(){
    console.log('Listen on 0.0.0.0:8888');
});

当我获取/错误时,expressjs打印出一个漂亮的错误,没有崩溃服务但是当我获取/ asyncerror它是一个经典的抛出,在服务器崩溃的stdout上打印..

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这是因为Express永远没有机会捕获/asyncerror示例中抛出的异常,因为您从async回调上下文而不是Express中间件上下文中抛出异常。通常,如果您不希望异步函数中的错误条件导致节点应用程序崩溃,请通过回调报告错误而不是抛出错误。在这种情况下,您可以调用next回调即收到的app.get参数但您没有使用。试试这个:

app.get('/asyncerror', function(req, res, next){
    var that = this;
    async.waterfall([
        function(next){
            console.log('1');
            next("42", "2");
        },
        function(arg, next) {
            console.log(arg);
            res.json('ok');
            next();
        }
        ], function(err){
            console.log(this);
            next(Error('Aie'));
        });
});