Mongolab nodejs拓扑被破坏

时间:2015-05-24 16:28:09

标签: javascript node.js mongodb twitter mlab

我使用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可以处理简单的请求。如果您对我收到此回复的原因有任何想法,请回答。

3 个答案:

答案 0 :(得分:11)

我遇到了类似的问题,在完成对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

希望它有所帮助!

答案 1 :(得分:9)

遇到同样的问题后,我发现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);

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

答案 2 :(得分:1)

我遇到了同样的问题。然后我有了升级我的猫鼬图书馆的想法。但是当我运行npm install mongoose时出现错误&#34; ... kerberos错误(未找到gssapi / gssapi.h文件)...&#34; 。所以经过一些研究后我发现要解决足够的问题来运行apt-get install libkrb5 -dev或者Had Hat yum install krb5 -devel。我做了npm之后安装了mongoose并解决了我的问题