2013-04-07 10 views
7

node.jsにネットワーク操作を実行するモジュールを作成しました。私はこのモジュール(以下の変数check)を使用する小さなスクリプトを書いた。これは次のようになります。node.js:プログラムが予期せず終了するか、ハングするだけです

check(obj, function (err, results) { 
    // ... 
    console.log("Check completed"); 
}); 

ここに興味深いものがあります。このコードをmochaテストの一部として実行すると、テストは期待どおりに終了します。ログステートメントが表示され、プロセスが終了します。

コードをスタンドアロンノードスクリプトとして実行すると、logステートメントが出力されますが、プロセスはハングアップします。

デバッグしようとしたときに、--debug-brkを使用してプログラムを起動し、node-inspectorを使用すると、早く終了します。 process.on 'exit'が呼び出されているのがわかります。モジュール内の内部コールバックがまだ呼び出されていない間に終了します。したがって、上記のログ文も出力されません。

私は今停止しており、なぜこれが起こっているのか分かりません。誰も同様の行動を見たことがありますか?

答えて

11

スクリプトとして実行し、「完了」したときにハングすると、ノードがまだイベント待ちのコールバックを持っていることを意味します。ノードは、それらのイベントがもはや発生しないことを知らない。終了する時間が分かっている場合はprocess.exit()に電話するか、すべて(ネットワーク接続、DB接続など)を明示的に閉じる/アンバインド/切断することができます。すべてを正しく閉じると、ノードは終了します。

モジュールwtfnode(Nathan Arthurが言及しています)またはwhy-is-node-runningはこれを追跡するのに役立ちます。

+5

ノードを開いたままにしていることを確認する方法はありますか。 – Aishwar

+4

ノードインスペクタがあり、プロセスにアタッチし、ノードのイベントループコードにブレークポイントを設定することができます。私はこれらの1つを正常に追跡したことはありません。 DB接続をオープンして明示的にクローズしたり、process.exit()を実行して自分の人生を変えたりするのは明らかです。 –

+6

process._getActiveHandles()およびprocess._getActiveRequests()を参照してください。http://stackoverflow.com/questions/17960452/how-can-i-get-a-list-of-callbacks-in-the-node-work-queue -or-why-wont-node-ex – aaron