2015-05-24 2 views
13

Я связываюсь с twitter, используя nodejs. Я пытаюсь зарегистрировать некоторые важные общедоступные пользовательские данные в базе данных mongolab mongodb. По какой-то причине я продолжаю получать «ошибку с топологией». Я не совсем уверен, почему это так.Уничтоженная топология Mongolab nodejs

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:[email protected]: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 работает с простыми запросами. Если у вас есть идеи о том, почему я получаю ответ, ответьте.

ответ

9

У меня была аналогичная проблема, соединение с базой данных закрывается до того, как все ваши запросы на твиттер сделаны и данные вставлены.

В результате я передал обратный вызов моей функции, как в документации.

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

Вы можете увидеть после вставки делаются они называют callback(result);

И это только анонимной функция, которая вызывает db.close()

Вот некоторые другие ссылки, которые могут помочь вам с открытием/закрытием db

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

Надеется, что это помогает!

+0

Ваше первое предложение было подсказкой, которую мне нужно было проследить через мой код, чтобы исправить ошибку. Я буквально закрыл соединение Mongoose _before_ обратный вызов, который сделал массовое вложение, и получил возможность выполнить свою задачу. Благодаря! – Saheed

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); 

Я надеюсь, что это поможет, или другие люди, имеющие эту «Топология была уничтожена» проблема ,

1

У меня была та же проблема. Тогда у меня возникла идея обновить мою библиотеку мангуста. Но когда я запускал npm install mongoose, появилась ошибка «... kerberos errors (файл gssapi/gssapi.h не найден) ...». Поэтому после некоторых исследований я увидел, что для решения достаточно для установки apt-install install libkrb5 -dev или для Had Hat yum install krb5 -devel. После того, как я сделал npm, установил mongoose и решил свою проблему.

+0

Можете ли вы очистить свой ответ и прояснить некоторые шаги? Возможно, я прав, я просто этого не понимаю. – blm

+0

Я просто последовал этому совету, и это сработало для меня. 'sudo aptitude install libkrb5-dev' && ' rm -rf node_modules' && 'npm install' И все. Спасибо @gilmar –

Смежные вопросы