19

Express アプリのエラー処理をセットアップしようとしていますが、次の問題が発生しています。

エラー ミドルウェアを定義し、最後のミドルウェアとして追加します。

// error handler
app.use(function(err, req, res, next) {

    console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...');
    next(err);
});

エラーが発生するたびに、このミドルウェアが呼び出されることを期待します。

app.get('/datenschutz', function(req, res, next){
        return next(new Error('Just testing')); // handle everything here
    });

しかし、私のミドルウェアは決して呼び出されません! ただし、ブラウザにはスタック トレースが表示されます。これは、このエラーをキャッチして処理する別のミドルウェアがあるようです。

問題は、セットアップが非常に単純であるため、このミドルウェアを定義できる場所がわからないことです。

// setup ssl for local testing
var
    app = express();

app.
    use(express.static(__dirname + '/public')).
    use(express.bodyParser()).
    use(express.cookieParser());

エラー処理ミドルウェアが呼び出されないのはなぜですか? この「デフォルト」のエラー処理はどこで行われていますか?

ありがとう!

*編集* ミドルウェアが実際に機能していることがわかります。ただし、これは、別のミドルウェア関数から呼び出す場合に当てはまります。ただし、高速ルートとして定義された関数 (GET、POST など) 内でエラーが発生した場合は呼び出されません。これは非常に奇妙です。エラー ミドルウェアをルート コールバックに追加すると、次のように機能します。

app.get('/testError', function(req, res, next){
        return next(new Error('Just testing')); // handle everything here
    }, function(err,req,res,next) {
        console.log('This error handler is called!!');
        return next();
    });

* 編集 2 - 受け入れ可能な回避策が見つかりました ** このようにしなければならないことに驚きました。エクスプレスでのエラー処理に関する多くのエントリ/質問を読んだことがありますが、この可能性について言及されたことはありませんでした。ただし、ルート コールバック内でエラーが発生した場合、通常のエラー ミドルウェア ハンドラはそれを検出しないようです。ルート レベルでエラー ハンドラを定義する必要があります。

app.all('*', function(err,req,res,next) {
        console.log('This is a global error handler at route level....');
        return next(err);
    });
4

4 に答える 4

3

Express 4 docs からのExpress 4 ユーザー向けの回答を更新しました。以下のドキュメントの例を参照してください。app.routerは推奨されておらず、使用されていないことに注意してください。順序を明確にするために、ダミーのルートも追加しました。

「エラー処理ミドルウェアは、他の app.use() およびルート呼び出しの後、最後に定義します。例:

var bodyParser = require('body-parser');

app.use(bodyParser());
app.get('/', function(req, res) {
    res.send('hello world');
})
app.use(function(err, req, res, next) {
  // logic
});

"

于 2015-03-05T05:34:51.847 に答える
1

EDIT 2(sabtioagoIT)は機能します。しかし、それを逃した人のためだけに、emostarのソリューションも機能します。エラー処理の「use」呼び出しを最後に移動することは理解しましたが、emosterが提案するように、(エラー処理の「use」呼び出しの前に)app.routerを使用する方が簡単なオプションのようです。

于 2013-01-30T13:41:37.857 に答える