【问题标题】:Mongolab nodejs topology destroyedMongolab nodejs拓扑被破坏
【发布时间】:2015-08-06 04:34:37
【问题描述】:

我一直在使用 nodejs 与 twitter 交互。我正在尝试在 mongolab mongodb 数据库中记录一些重要的公共用户数据。出于某种原因,我不断收到“拓扑破坏错误”,我不太确定这是为什么。

var Twitter = require('twitter');
var mongodb = require('mongodb');

var accounts = ['@zaynmalik',
'@ZooeyDeschanel'];

var client = new Twitter({
  consumer_key: 'key',
  consumer_secret: 'secret',
  access_token_key: 'key',
  access_token_secret: 'secret'
});

var MongoClient = mongodb.MongoClient;
var url = "mongodb://user:pass@mongolab.com:numbers/db";

MongoClient.connect(url, function (err, db) {
  if (err) {
    console.log('Unable to connect to the mongoDB server. Error:', err);
  } else {
    //HURRAY!! We are connected. :)
    console.log('Connection established to database');

    var collection = db.collection('accounts');

    for(var i = 0; i < accounts.length; i++){
        client.get('users/show', {screen_name: accounts[i]}, function(error, tweets, response){
          if(error) console.log(error);
              var account = {'screen_name': accounts[i], 'id': tweets.id};
              collection.insert(account, {w:1}, function(err, result) {console.log(err);});
              //collection.insert(account);
              console.log(tweets.id);  // Raw response object. 
        });

}

    db.close();
  }
});

如您所见,程序建立了与数据库的连接。定义集合,然后遍历多个 Twitter 帐户并记录相关信息。 twitter 请求成功,mongodb 可以处理简单的请求。如果您对我收到此回复的原因有任何想法,请回答。

【问题讨论】:

    标签: javascript node.js mongodb twitter mlab


    【解决方案1】:

    我遇到了类似的问题,在您完成所有对 twitter 的请求并插入数据之前,您的数据库连接已关闭。

    我最终像文档中那样向我的函数发送回调。

    https://github.com/mongodb/node-mongodb-native#inserting-a-document

    你可以看到插入完成后他们调用callback(result);

    这只是调用db.close()的匿名函数

    这里有一些其他链接可能会帮助您打开/关闭数据库连接

    When to close MongoDB database connection in Nodejs

    Why is it recommended not to close a MongoDB connection anywhere in Node.js code?

    Keeping open a MongoDB database connection

    希望对你有帮助!

    【讨论】:

    • 你的第一句话是我需要通过我的代码来修复错误的提示。 进行批量插入的回调有机会完成其任务之前,我实际上是在关闭 Mongoose 连接。谢谢!
    • 愚蠢的是,我收到了这个“拓扑”错误,因为我立即关闭了复制和粘贴代码的数据库连接,因此我无法执行任何其他数据库操作。至少你的链接让我更仔细地检查了我的代码。
    【解决方案2】:

    遇到同样的问题,我发现Mongolab recommends to apply the following settings是为了在生产中保持Mongodb的连接:

    var options = {
      server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },
      replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }
    };
    mongoose.connect(secrets.db, options);
    

    我希望这对您或其他遇到“拓扑被破坏”问题的人有所帮助。

    【讨论】:

    • connectTimeoutMS:30000后会怎样,不会再试了?默认是 30 秒吧?
    【解决方案3】:

    我遇到了同样的问题。然后我有了升级我的猫鼬库的想法。但是当我运行 npm install mongoose 时出现错误“... kerberos errors (gssapi / gssapi.h file not found) ...”。因此,经过一些研究,我发现足以解决运行 apt-get install libkrb5 -dev 或 Had Hat yum install krb5 -devel 的问题。在我做了 npm install mongoose 并解决了我的问题之后

    【讨论】:

    • 你能清理你的答案并澄清一些步骤吗?可能是对的,我就是不明白。
    • 我只是遵循了这个建议,它对我有用。 sudo aptitude install libkrb5-dev && rm -rf node_modules && npm install 就是这样。谢谢@gilmar
    猜你喜欢
    • 2020-10-23
    • 2015-09-03
    • 2015-07-09
    • 2016-12-27
    • 2021-04-30
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多