1

commander.jsを使用してMongooseモデルをコマンドラインで操作するためのスクリプトをいくつか書いています(最終的には、 Cronを使用してこれらのツールを実行したいと考えています)。

現在、いくつかのスクリプトを で作成しましたがcommander、すべて正常に動作しますが、 を使用して MongoDB データベースに接続すると、mongoose完了後にスクリプトがハングするだけです。さて、データベース接続がノードを維持していると考えたので、mongoose.disconnect()行を追加しましたが、それでもハングします。

シャットダウンできることがわかったのは、を使用するprocess.exit()ことだけですが、プロセスを終了するだけでは気が進まないのです。正常なシャットダウンをトリガーするために特に行うべきことはありますか?

4

3 に答える 3

0

APIドキュメントを読んだことは、コールバック関数を指定する.disconnect() 必要があることを意味します。切断されているものごとに呼び出され、エラーが渡される可能性があるようです。

コードにチェックがあり、問題が解決したときに存在しない場合は呼び出されないことを確認しますが、そのチェックはエラーに対して実行されていないため、MongooseがMongoDBクライアントからエラーメッセージを受信した場合は、接続を開いたままにしておくと、実行が停止しません。

データベースへの接続を1つだけ開いている[Connection object].close()場合は、コールバックが指定されていない場合、その関数がノーオペレーションの「コールバック」を正しく挿入し、正しく破壊されるように見えるため、呼び出したい場合があります。

(Mongooseを詳しく調べるほど、MongoDBクライアントの周りに薄いラッパーを記述したいので、Mongooseの「ヘルプ」に対処する必要はありません。)

于 2012-04-27T18:53:03.117 に答える
0

非同期の「シリーズ」を使用して操作を実行し、完了時にmongoose.connection.close()を呼び出します。コールバック地獄を防ぎ、一度に 1 つずつ、または他のすべてのメソッドが完了したときに関数に続いて並列に操作をきちんと実行できます。私は、マングースを必要とするが、すべてのマングース操作が終了した後に終了することを意図したスクリプトに常に使用しています。

于 2012-07-19T23:53:58.863 に答える
0

ノード プログラムを直接シャットダウンすると、問題が解決するわけではなく、症状が隠されます。

最終的に問題を特定したところ、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()、状況がうまく修正されます!

于 2012-04-28T21:16:24.813 に答える