4

我有一个一次性节点脚本,它对 MongoLab 上的 MongoDB 数据库进行了一些更改。然而,一旦它完成,它永远不会退出事件循环(我总是必须 ctrl+C 它),无论我做了多少db.close()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 的代码,它可以正常工作。所以更有可能是导致这种情况的驱动程序/操作系统/节点版本的奇怪组合。我建议将您的节点和驱动程序升级到最新版本,然后重试。

于 2013-01-15T12:13:40.803 回答