sql >> データベース >  >> NoSQL >> MongoDB

Node.jsとmongodbでタイムアウトを処理する

    UPD:
    この投稿に基づくと、ここで行っているのと同じことを行う修正プログラムが展開されているようです。これがすでにnpm(15.10.13)内にあるかどうかはわかりません。 https://github.com/mongodb/node -mongodb-native / issues / 1092#ref-commit-2667d13

    調査の結果、そこで何が起こっているのかを理解することができました。
    データベースを処理するメソッド(検索、更新、挿入など)を呼び出すたびに、独自のIDを持つカーソルが作成され、それ自体が登録されます。後でコールバックされるためにDbのEventEmitterに送信されます。その間、同じCallBackStore内の_notRepliedオブジェクトに自分自身を登録します。

    しかし、接続が閉じられると、_notRepliedカーソルを反復処理し、エラーまたはタイマー付きのロジックでトリガーするものを見つけることができませんでした(まだどこかにある可能性があります)。だから私はなんとか小さな回避策を書くことができました、それはDBがcloseを出すときにエラーでカーソルを強制的にトリガーします イベント:

    new mongodb.Db('testdb', new mongodb.Server('localhost', 27017, { }), { safe: true }).open(function (err, db) {
      if (!err) {
        db.on('close', function() {
          if (this._callBackStore) {
            for(var key in this._callBackStore._notReplied) {
              this._callHandler(key, null, 'Connection Closed!');
            }
          }
        });
    
        // ...
    
      } else {
        console.log(err)
      }
    });
    

    MongoClientの代わりに最初のアプローチを使用することをお勧めします。理由はほとんどありません。たとえば、接続を閉じてから.findを呼び出す場合です。 コールバックでエラーが適切にトリガーされますが、MongoClientではトリガーされません。

    MongoClientを使用している場合:

    MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
      if (!err) {
        db.on('close', function() {
          if (this._callBackStore) {
            for(var key in this._callBackStore._notReplied) {
              this._callHandler(key, null, 'Connection Closed!');
            }
          }
        });
    
        // ...
    
      } else {
        console.log(err);
      }
    });
    

    これは何をしますか?接続が閉じられると、すべての_notRepliedカーソルを繰り返し処理し、エラーConnection Closed!でイベントをトリガーします。 。

    テストケース:

    items.find({ }).toArray(function(err, data) {
      if (!err) {
        console.log('Items found successfully');
      } else {
        console.log(err);
      }
    });
    db.close();
    

    これにより、データベース接続が強制的に閉じられ、closeがトリガーされます 以前に処理し、カーソルが確実に閉じられるようにするイベント。

    UPD:GitHubにIssueを追加しました: https://github.com / mongodb / node-mongodb-native / issues / 1092 これに関して彼らが何を言っているか見ていきます。



    1. MongoDBで2つの配列にインデックスを付けるにはどうすればよいですか?

    2. MongoDB:複数の配列要素に一致します

    3. Hadoop RecordReaderの紹介、作業とタイプ

    4. MongoDB:3.6 mongoDbバージョンで日付を解析する方法は?