4

MongoLab の MongoDB データベースにいくつかの変更を加えるワンショット Node スクリプトがあります。db.close()ただし、終了すると、イベントループを終了することはありません (常に ctrl+C を実行する必要があります) db.logout()

奇妙なことに、ローカルで実行中のインスタンスを起動してmongodそれに接続すると、スクリプトは正常に終了しますが、リモート接続は決して終了しません。

これは、まだ問題があるスクリプトの短いバージョンです (コマンド ラインでサーバーへの URL を取得します)。どうしたの?

var mongodb = require("mongodb");

function onSuccess(cb){
  return function(err) {
    if (err) {
      console.error(err)
    } else {
      cb.apply(this,Array.prototype.slice.call(arguments,1))
    }
  }
}

console.log("Connecting to "+process.argv[2]+' ...');
mongodb.MongoClient.connect(process.argv[2],onSuccess(function(db){
  console.log("Connected.");
  db.logout(onSuccess(function(logoutResult){
    db.close(onSuccess(function(closeResult){
      console.log("All finished. Can has prompt return nao?")
    }));
  }));
}));
4

2 に答える 2

1

それはあなたがあなたのクロージャーを定義した方法に関係しているのではないかと思いますが、私はそれに指を置くことができません。

価値のあるものとして、以下は私が使用するアプローチであり、これは期待どおりに接続を閉じます。

MongoClient.connect(dbUrl, function(err, db) {

  if(err) return callback(err);

  var collection = db.collection(dbCollection);
  collection.find().toArray(function(err, items){

    db.close()
    if(err) return callback(err);
    callback(null, items);

  });

});

完全な例はここにあります:https ://github.com/hectorcorrea/mongoDbSample

于 2012-12-21T14:28:56.520 に答える
1

ドライバーバージョン1.2.7/1.2.8と最新の1.2.9を使用して、mongolabに対してコードを試してみたところ、正しく機能します。そのため、これを引き起こしているのは、ドライバー/OS/ノードバージョンの奇妙な組み合わせである可能性が高いです。ノードとドライバーを最新バージョンにアップグレードして、再試行することをお勧めします。

于 2013-01-15T12:13:40.803 に答える