web-dev-qa-db-fra.com

Topologie mongolab nodejs détruite

J'interagissais avec Twitter en utilisant nodejs. J'essaie de consigner certaines données utilisateur publiques importantes dans une base de données mongolab mongodb. Pour une raison quelconque, je continue à recevoir une "erreur de topologie détruite". Je ne sais pas trop pourquoi.

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

Comme vous pouvez le constater, le programme établit une connexion avec la base de données. Définit la collection, puis itère à travers un certain nombre de comptes Twitter et enregistre les informations pertinentes. Les requêtes sur Twitter ont abouti et mongodb fonctionne avec des requêtes simples. Si vous avez des idées sur les raisons pour lesquelles je reçois cette réponse, veuillez y répondre.

14
Aidan Collins

J'ai eu un problème similaire, votre connexion à la base de données est fermée avant que toutes vos demandes à Twitter ne soient effectuées et les données insérées.

J'ai fini par envoyer un rappel à ma fonction comme ils le font dans la documentation.

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

Vous pouvez voir qu'une fois l'insertion terminée, ils appellent callback(result);

Et ce n'est qu'une fonction anonyme qui appelle db.close()

Voici d'autres liens qui pourraient vous aider à ouvrir/fermer des connexions à une base de données.

Quand fermer la connexion à la base de données MongoDB dans Nodejs

Pourquoi est-il recommandé de ne pas fermer une connexion MongoDB dans le code Node.js?

Maintenir ouverte une connexion à une base de données MongoDB

J'espère que ça aide!

11
alucic

Ayant rencontré le même problème, j’ai constaté que Mongolab recommande d’appliquer les paramètres suivants afin de maintenir la connexion de Mongodb en production:

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

J'espère que cela vous aidera, vous ou d'autres personnes ayant ce problème "La topologie a été détruite".

9
Adrien Joly

J'ai eu le même problème. Ensuite, j'ai eu l'idée de mettre à niveau ma bibliothèque de mangoustes. Mais alors que j’exécutais l’installation de npm mongoose, l’erreur "... erreurs kerberos (fichier gssapi/gssapi.h non trouvé) ...". Donc, après quelques recherches, j'ai vu qu'il suffisait de résoudre apt pour installer install libkrb5 -dev ou Had Hat pour installer krb5 -devel. Après avoir fait npm installer la mangouste et résolu mon problème

1
gilmar