2013-06-30 6 views
9

私はnodejsサーバを使って、httpコールをサーバに送ります。何か悪いことが起こった場合、サーバーを正常にシャットダウンするための推奨される方法はありますか?何とかサーバーを稼働させたままにする必要がありますか?Nodejs/express、正常にシャットダウン

I.E.私はこれが接続されたクライアントを殺し、応答を返すことはないと思います。

はI必要があります:私は、サーバーが死ぬ(して再起動)することを可能にする前に、すべてのHTTP接続のための

  1. が完了するのを待ちます。
  2. サーバーを停止しないでください。

これは適切ですか?

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

この場合、サーバを未定義の状態にしてもエラーが発生し、サーバは残りの接続を完了し続けます。

エラーを処理するための良い方法はありますか、またはサーバーを終了して再起動する必要がありますか?

答えて

6

処理されていない例外を気にしないでください。サーバーを死に至らせてください。

一般的に、ルートハンドラが例外をスローすると、Expressは単にそれをキャッチしてHTTP 500をクライアントに返します。エクスプレスは例外をキャッチしたので、サーバーはクラッシュしません。

通常、コールバック内で例外がスローされると、サーバーが停止します。

コールバックは当然Expressルータのコールスタックの外側で実行されるため、特定の要求に関連付ける方法はありません。しかし、あなたがこのような状況を防ぐことができます。

app.get('/foo', function(req, res, next) { 
    db.query(..., function(err, r) { 
     try { 
      throw new Error(); 
     } catch(ex) { 
      next(ex); 
     } 
    }); 
}); 

Expressのnext機能は、最初の引数としてエラーになります。エラー引数でnextを呼び出した場合、それはおそらく過剰ですtry/catchすべてを包む、ルートの処理を停止し、error handlerを探し、あるいは単にもちろん500

を返します。ほとんどのものは実際に例外をスローしません。 を知っている場合にのみ、これを行う必要があります。そうしないと、例外を飲み込むことによって、一貫性のない状態をデバッグすることが非常に困難になることがあります。

予期しない例外がスローされると、アプリケーションは未定義の状態になることを覚えておくことが重要です。問題の要求が完了せず、アプリが再起動しない可能性があります。または、他の奇妙なことが起こる可能性があります。 (データベースの問題でしたか?ファイルシステム?破損したメモリですか?)

この種の状況は、診断するのが非常に難しく、デバッグが非常に少ないです。サーバーをすばやく失敗させ、クラッシュさせ、サーバーをすばやく再起動することは、安全では間違いなく良い方法です。はい、接続されているクライアントはすべて切断されますが、再試行するだけでも簡単です。

可用性が心配な場合は、cluster moduleを使用して、複数の(通常はCPUコア数の)サーバープロセスを実行し、1つのクラッシュによってサイト全体がダウンすることはありません。

+1

これは素晴らしい説明です。一つのことはまだ私はまだ不明です。 '予期しない例外がスローされると、アプリケーションは未定義の状態にあることを覚えておくことが重要です。問題の要求が決して完了せず、アプリが決して再起動しない可能性があります。それは私がアプリを呼び出すべきでないかのようにそれをサウンドにします。閉じる();プロセス '出口'で。本当ですか? – lostintranslation

+0

'process'' exit'ハンドラで' app.close() 'を呼び出すのは無意味です:[docs say](http://nodejs.org/api/process.html#process_event_exit)*"メインイベントループは'exit'コールバックが終了した後でもはや実行されません。 "*つまり、exitイベントは、あなたの関数が復帰した後に**処理が終了する**ことを伝えています。次のティックがないので、ネットワークリスナーを閉じることは無意味です。着信接続を受け入れるコードは決して実行する機会を与えません。 – josh3736

+0

素晴らしい、ありがとう! – lostintranslation

5

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

server.close([callback])

新しい接続を受け付けからサーバーを停止し、既存の の接続を維持します。この関数は非同期で、すべての接続が終了し、サーバーがclose イベントを発行すると、サーバーは最後に を閉じます。オプションで、コールバックを渡してclose イベントを待ち受けることができます。

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

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

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

ノードが存在し、実際に終了するノードを教えていたときにこの関数を実行する必要があり


http://nodejs.org/api/net.htmlを参照してください。ここでは、あなたのプロセスを終了することができますが、それが正常に終了しません一つの方法は次のとおりです。

process.exit([code])

は、指定されたコードでプロセスを終了します。省略すると、exitは の「成功」コード0を使用します。ノードは1として終了コード を参照すべきである実行

process.exit(1);シェル:「不良」コードで終了し

私はこのことができます願っていhttp://nodejs.org/api/process.html


を参照してください!