13

Express to server out http 呼び出しを実行している nodejs サーバーがあります。何か問題が発生した場合にサーバーを正常にシャットダウンするための推奨される方法はありますか? どうにかしてサーバーを実行したままにしておく必要がありますか?

キャッチされない例外で IE サーバーが停止するだけです。これにより、接続されているクライアントが強制終了され、応答が返されないと思います。

するべきか:

  1. すべての http 接続が完了するのを待ってから、サーバーを停止させます (その後、サーバーを再起動します)。
  2. または、サーバーが停止しないようにする必要がありますか?

これは適切ですか?

process.on('exit', function () {
  console.log('About to exit, waiting for remaining connections to complete');
  app.close();
});

この場合、エラーがスローされ、サーバーが未定義の状態のままになっている可能性があり、サーバーは引き続き残りの接続を終了します。

エラーを処理し続ける良い方法はありますか、それともサーバーを停止させて再起動させるべきですか?

4

3 に答える 3

15

何も起こらないと NodeJS はシャットダウンします。http サーバーが接続を待機している間、ノードは実行されたままになります。

server.close([callback])

サーバーが新しい接続を受け入れるのを停止し、既存の接続を保持します。この関数は非同期です。すべての接続が終了し、サーバーがclose イベントを発行すると、サーバーは最終的に閉じられます。close 必要に応じて、イベントをリッスンするコールバックを渡すことができます。

これを行うと、サーバーは最後の接続が終了するまで実行を続け、その後正常にシャットダウンします。

接続が終了するのを待ちたくない場合は、残りの接続でsocket.end()orを使用できます。socket.destroy()

http://nodejs.org/api/net.htmlを参照してください


process.on('exit', function () {
    console.log('About to exit, waiting for remaining connections to complete');
    app.close();
});

この関数は、ノードが存在するときに実行する必要があり、実際にノードに終了を指示するのではありません。プロセスを終了する方法の 1 つを次に示しますが、正常に終了することはありません。

process.exit([code])

指定されたコードでプロセスを終了します。省略した場合、exit は「成功」コードを使用します0

「失敗」コードで終了するには:

process.exit(1);node を実行したシェルは、終了コードを1.

http://nodejs.org/api/process.htmlを参照してください


これが役立つことを願っています!

于 2013-06-30T19:45:27.580 に答える
8

未処理の例外で派手なことをしようとしないでください。サーバーを死なせます。

一般に、ルート ハンドラーが例外をスローした場合、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 つのクラッシュでサイト全体がダウンしないようにします。

于 2013-07-01T03:33:17.417 に答える
0

Express を使用している場合は、この npm モジュールを使用してシャットダウンを適切に処理できます。

https://www.npmjs.com/package/express-graceful-shutdown

于 2016-05-19T10:41:12.610 に答える