web-dev-qa-db-ja.com

Mongolab nodejsトポロジが破壊されました

私は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:[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はシンプルなリクエストで動作します。なぜ私がこの返答を受け取っているのかについて何か考えがあれば、答えてください。

16
Aidan Collins

同様の問題がありました。Twitterへのリクエストがすべて完了してデータが挿入される前に、データベース接続が閉じられました。

ドキュメントで行うように、コールバックを関数に送信してしまいました。

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

挿入が完了すると、callback(result);が呼び出されます。

そして、それはdb.close()を呼び出す単なる無名関数です

DB接続の開閉に役立つその他のリンクをいくつか紹介します

NodejsでMongoDBデータベース接続を閉じるタイミング

Node.jsコードのどこでもMongoDB接続を閉じないことが推奨されるのはなぜですか?

MongoDBデータベース接続を開いたままにする

それが役に立てば幸い!

11
alucic

同じ問題が発生したので、Mongodbの接続を本番環境で維持するために Mongolabは次の設定を適用することをお勧めします であることがわかりました。

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

これがあなた、またはこの「トポロジが破壊された」問題を抱えている他の人々の助けとなることを願っています。

9
Adrien Joly

私も同じ問題を抱えていました。次に、マングースライブラリをアップグレードするというアイデアがありました。しかし、npm install mongooseを実行していたときに、「... kerberosエラー(gssapi/gssapi.hファイルが見つかりません)...」というエラーが表示されました。調査の結果、apt- get install libkrb5 -devまたはHad Hat yum install krb5 -develを実行するのに十分な解決策があることがわかりました。 npmを実行した後、マングースをインストールして問題を解決しました

1
gilmar