Mongolab nodejs拓扑被破坏

Posted

技术标签:

【中文标题】Mongolab nodejs拓扑被破坏【英文标题】:Mongolab nodejs topology destroyed 【发布时间】: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 可以处理简单的请求。如果您对我收到此回复的原因有任何想法,请回答。

【问题讨论】:

【参考方案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

以上是关于Mongolab nodejs拓扑被破坏的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:拓扑被破坏,NODEJS

MongoError:拓扑被破坏,NODEJS

在 Heroku 上的 NodeJS 中,MongoDB 与 MongoLab 的连接超时

破坏声明/标识符“名称”中缺少初始化程序已被声明 [mysql] [nodejs]

如何在 mongoLab 和 Heroku 服务器中使用 mongo URI

与 nodejs、mongoose 和 JSON 对象数组拼接