4

async.waterfallでスローされたときにexpressjsがエラーを処理しない理由がわかりません

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

/error を取得すると、expressjs はクラッシュ サーバーなしで適切なエラーを出力しますが、/asyncerror を取得すると、サーバー クラッシュで標準出力に出力されます。

ありがとうございます。

4

1 に答える 1

3

これは、Expressミドルウェアコンテキストではなく、コールバックコンテキスト/asyncerror内からスローしているため、Expressには例でスローされた例外をキャッチする機会がないためです。async一般に、非同期関数のエラー条件でノードアプリがクラッシュしないようにする場合は、エラーをスローするのではなく、コールバックを介して報告します。この場合、コールバックが受信しているが使用していない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'));
        });
});
于 2012-09-26T12:19:05.463 に答える