未処理の例外で派手なことをしようとしないでください。サーバーを死なせます。
一般に、ルート ハンドラーが例外をスローした場合、Express は単純にそれをキャッチし、HTTP 500 をクライアントに返します。Express が例外をキャッチしたため、サーバーがクラッシュすることはありません。
通常、サーバーが停止するのは、コールバック内で例外がスローされた場合です。例えば:
app.get('/foo', function(req, res) {
db.query(..., function(err, r) {
throw new Error(); // oops, we'll crash
});
});
コールバックは Express ルーターのコール スタックの外部で自然に実行されるため、特定の要求に関連付ける方法はありません。ただし、このような状況を防ぐことができます。
app.get('/foo', function(req, res, next) {
db.query(..., function(err, r) {
try {
throw new Error();
} catch(ex) {
next(ex);
}
});
});
Express'next
関数は、最初の引数としてエラーを受け取ります。error 引数を指定して呼び出すと、ルートの処理を停止してエラー ハンドラnext
を探すか、単に 500 を返します。
もちろん、すべてをtry
/catch
で囲むのはおそらくやり過ぎです。ほとんどのものは、実際には例外をスローしません。何かがスローされる可能性があることがわかっている場合にのみ、これを行う必要があります。そうしないと、例外を飲み込んで一貫性のない状態をデバッグすることが非常に困難になる可能性があります。
予期しない例外がスローされると、アプリケーションは未定義の状態になることに注意してください。問題のリクエストが完了せず、アプリが再起動しない可能性があります。または、他にも多くの奇妙なことが起こる可能性があります。(データベースの問題ですか? ファイルシステムですか? メモリの破損ですか?)
このような状況は診断が非常に難しく、デバッグはなおさら困難です。すぐに失敗してクラッシュし、サーバーをすばやく再起動する方が安全であり、間違いなく優れています。はい、たまたま接続されていたクライアントは切断されますが、単純に再試行するのは簡単です.
可用性が心配な場合は、クラスター モジュールを使用して、複数 (通常は CPU コアの数) のサーバー プロセスを実行し、1 つのクラッシュでサイト全体がダウンしないようにします。