2015-05-24 14 views
13

Mi sono interfacciato con Twitter utilizzando nodejs. Sto cercando di registrare alcuni dati importanti dell'utente pubblico in un database mongolab mongodb. Per qualche ragione continuo a ricevere un "errore distrutto dalla topologia". Non sono abbastanza sicuro del motivo.Topologia nodo Mongolab distrutta

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

Come si può vedere il programma stabilisce una connessione al database. Definisce la raccolta, quindi itera su un numero di account Twitter e registra le informazioni pertinenti. Le richieste di twitter hanno successo e il mongodb funziona con richieste semplici. Se hai qualche idea sul motivo per cui ricevo questa risposta, per favore rispondi.

risposta

9

Ho avuto un problema simile, la connessione al database viene chiusa prima che tutte le richieste su Twitter vengano eseguite e dati inseriti.

Ho finito per inviare il callback alla mia funzione come lo fanno nella documentazione.

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

Si può vedere dopo l'inserimento è fatto lo chiamano callback(result);

Ed è proprio funzione anonima che chiama db.close()

Ecco alcuni altri collegamenti che potrebbero aiutare a uscire con apertura/chiusura connessioni 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

Speranza che aiuta!

+0

La prima frase era il suggerimento di cui avevo bisogno per cercare il codice per correggere l'errore. Stavo letteralmente chiudendo la connessione Mongoose _prima_ una richiamata che consentiva all'inserzione di massa di completare il proprio compito. Grazie! – Saheed

9

Dopo aver sperimentato lo stesso problema, ho scoperto che Mongolab recommends to apply the following settings al fine di mantenere viva la connessione di MongoDB nella produzione:

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

Spero che questo vi aiuterà, o di altre persone che hanno questa "Topologia stato distrutto" problema .

1

Ho avuto lo stesso problema. Poi ho avuto l'idea di aggiornare la mia libreria di manguste. Ma mentre stavo eseguendo npm install mongoose è apparso l'errore "... errori kerberos (file gssapi/gssapi.h non trovato) ...". Così dopo alcune ricerche ho visto che risolvere abbastanza per eseguire apt- get install libkrb5 -dev o Had Hat yum install krb5 -devel. Dopo aver fatto installare npm il mangusta e risolto il mio problema

+0

Puoi pulire la risposta e chiarire alcuni dei passaggi? Potrebbe essere giusto, io proprio non lo capisco. – blm

+0

Ho appena seguito questo consiglio e ha funzionato per me. 'sudo aptitude install libkrb5-dev' && ' rm -rf node_modules' && 'npm install' E questo è tutto. Grazie a @gilmar –

Problemi correlati