sql >> Database >  >> NoSQL >> MongoDB

Time-outs afhandelen met Node.js en mongodb

UPD:
Op basis van dit bericht lijkt het erop dat ze een oplossing hebben geïmplementeerd die hetzelfde zal doen als wat wij hier doen. Ik weet niet zeker of dit al binnen npm is (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Na wat onderzoek ben ik erin geslaagd te begrijpen wat daar aan de hand is:
Elke keer dat je een methode aanroept om met de database om te gaan (zoeken, bijwerken, invoegen, enz.), creëert het een cursor, die een eigen ID heeft en zichzelf registreert naar EventEmitter van Db om later teruggebeld te worden. Ondertussen registreert het zichzelf bij het _notReplied-object binnen dezelfde CallBackStore.

Maar zodra de verbinding is gesloten, kon ik niets vinden dat door _notReplied-cursors zou gaan en ze zou activeren met fouten of enige logica met timers (het kan daar nog steeds ergens zijn). Dus ik ben erin geslaagd om een ​​kleine work around te schrijven, dat dwingt cursors met een fout te activeren wanneer DB close uitzendt evenement:

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

Ik raad aan om de eerste benadering te gebruiken in plaats van MongoClient. Redenen zijn er maar weinig:bijvoorbeeld wanneer u de verbinding verbreekt en vervolgens .find . belt het zal correct een fout veroorzaken bij het terugbellen, terwijl dit bij MongoClient niet zal gebeuren.

Als u MongoClient gebruikt:

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

Wat zal dit doen? Zodra de verbinding is gesloten, zal het door alle _notReplied-cursors heen gaan en gebeurtenissen voor hen activeren met de fout Connection Closed! .

Testcase:

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

Dat dwingt een databaseverbinding te sluiten en activeert close gebeurtenis die u eerder afhandelt en ervoor zorgt dat de cursor wordt gesloten.

UPD:ik heb een probleem toegevoegd op GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 we zullen zien wat ze hierover zeggen.



  1. Verbind en bevraag Mongo-database via SSH met privésleutel in Python

  2. Maak verbinding met Kubernetes mongo db in een andere naamruimte

  3. MongoDB $replaceOne

  4. MongoDB $pull-syntaxis