私が持っていたエラー処理の質問に答えるために、この質問で受け入れられた答えを見つけました。
ただし、コメントに注意してください。アプリケーションが最終的にメモリを使い果たしないように、http.ServerResponseを終了する必要があります。これは懸念事項です。
しかし、どのようにそのようなものを実装するでしょうか?コールバック関数はどのようにして上記のオブジェクトにアクセスできますか?
私が持っていたエラー処理の質問に答えるために、この質問で受け入れられた答えを見つけました。
ただし、コメントに注意してください。アプリケーションが最終的にメモリを使い果たしないように、http.ServerResponseを終了する必要があります。これは懸念事項です。
しかし、どのようにそのようなものを実装するでしょうか?コールバック関数はどのようにして上記のオブジェクトにアクセスできますか?
ハンドラーは'uncaughtException'
応答オブジェクトにアクセスできないため、応答を終了できません。'uncaughtException'
コメントの推定ポイントは、多くの場合(前述のような)、エラーを適切に処理するための適切な範囲にいないため、すべてのエラー処理のニーズに依存するべきではないということです。
この投稿への回答で述べられているように(キャッチされていない例外がある場合、最善のアプローチはプロセスを停止させてそこから回復させることです)、そうでない場合はアプリケーションの現在の状態がわかりません。
例外をキャッチしなかったため、アプリケーションが何が起こったのかを知らないことを示唆しています。これを回避するには、アプリケーションを1つのプロセスではなく、多数の小さなチャンクで設計します。
これはパフォーマンス(RPCとプロセス通信)にわずかな影響を及ぼしますが、小さなチャンクがうまくいかない間は簡単に眠ることができ、再起動すると、内部で状態を維持することがないため、すべてが正常になります(そのためにRedisを使用してください)...
リクエスト内で本当に例外をキャッチし、リクエストでend()を呼び出す場合は、次のようにレスポンスにアクセスできるクロージャを使用する必要があります。
// a method that will catch an error and close the response
var runFunctionSafely = function(res, tryFunction){
try{
tryFunction();
}
catch(error){
console.log('there was an error, closing the response...');
console.log(error);
res.end();
}
}
app.get('/test', function(req, res, next) {
runFunctionSafely(res, function(){
throw new Error('this is a problem');
})
});