ノード プログラムを直接シャットダウンすると、問題が解決するわけではなく、症状が隠されます。
最終的に問題を特定したところ、Mongoose スキーマ定義に問題があることがわかりました。Mongoose スキーマが定義された直後に接続をシャットダウンしようとすると1、アプリケーションがハングし、最終的に MongDB 関連の奇妙なエラーが発生します。
program.parse(argv)
コマンダー アプリケーションを実行するための行を実行する前に短いタイムアウトを追加すると、問題が修正されます。次のようにコードをラップするだけです。
var program = require('commander')
, mongoose = require('mongoose')
, models = null
;
// Define command line syntax.
program
.command(...)
;
mongoose.connect(
..., // connection parameters.
function() {
// connected to database, defined schemas.
models = require('./models');
// Wait 1 second before running the application code.
setTimeout(function(){
program.parser(process.argv);
}, 1000);
}
);
1: これは私の最初の解釈であり、(まだ) この理論を広範囲にテストしていません。ただし、アプリケーションから Mongoose スキーマ定義を削除すると、アプリケーションのハングは正常に防止されます。
実際、呼び出しprocess.nextTick()
の代わりに使用するだけでsetTimeout()
、状況がうまく修正されます!