Express のかなり基本的な側面のように見えるものを処理する方法を理解するのに苦労しています。非同期コールバックで例外をスローするコードがある場合、その例外をキャッチする方法はありません。これは、コールバックが実行されるまでに try/catch ブロックがスコープ内にないためです。これらのシナリオでは、サーバーが応答していないことを最終的に断念するまで、ブラウザーはハングします。これは非常に悪いユーザー エクスペリエンスです。クライアントに 500 エラーをすぐに返せるようにしたいです。デフォルトのエクスプレス エラー ハンドラは、明らかにこの状況を処理しません。サンプルコードは次のとおりです。
var express = require("express");
var app = express();
app.use(app.router);
//express error handler (never called)
app.use(function(err, req, res, next) {
console.log(err);
res.send(500);
});
app.get("/test", function(req, res, next) {
require("fs").readFile("/some/file", function(err, data) {
a.b(); //blow up
});
});
app.listen(8888);
上記のコードでは、行 ab() が「ReferenceError: a is not defined」例外をスローします。定義されたエラー ハンドラが呼び出されることはありません。この場合、ファイルが正しく読み取られたため、 fs.readFile() によって返される err オブジェクトが null であることに注意してください。バグは、非同期ハンドラー内のコードです。
ノードの uncaughtExpception の使用に関するこの投稿を読みましたが、ドキュメントにはそのメソッドを使用しないと記載されています。使用したとしても、500 応答をユーザーに返すにはどうすればよいでしょうか。エクスプレス レスポンス オブジェクトはもう使用できません。
では、このシナリオをどのように処理しますか?