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