sql >> Databasteknik >  >> NoSQL >> MongoDB

Hantera timeouts med Node.js och mongodb

UPD:
Baserat på det här inlägget ser det ut som att de har implementerat en fix som kommer att göra samma sak som det vi gör här. Inte säker på om detta redan är inom npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Efter lite undersökning har jag lyckats förstå vad som händer där:
Varje gång du anropar någon metod för att hantera databasen (hitta, uppdatera, infoga, etc.) skapar den en markör som har ett eget ID och registrerar sig själv till EventEmitter av Db för att bli uppringd senare. Under tiden registrerar den sig själv till _notReplied-objektet inom samma CallBackStore.

Men när anslutningen är stängd kunde jag inte hitta något som skulle iterera genom _notReplied-markörer och som skulle trigga dem med fel eller någon logik med timers (det kan fortfarande finnas någonstans där). Så jag har lyckats skriva lite arbete runt, som tvingar utlösa markörer med fel när DB sänder ut close händelse:

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

Jag rekommenderar att du använder den första metoden istället för MongoClient. Det finns få anledningar:till exempel när du stänger anslutningen och sedan ringer .find det kommer att utlösa fel vid återuppringning, medan det inte gör det med MongoClient.

Om du använder 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);
  }
});

Vad kommer detta att göra? När anslutningen är stängd kommer den att iterera genom alla _notReplied-markörer och utlösa händelser för dem med felet Connection Closed! .

Testfall:

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

Det tvingar till att stänga databasanslutningen och utlösa close händelse som du hanterar tidigare och kommer att se till att markören kommer att stängas.

UPD:Jag har lagt till problem på GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 vi får se vad de säger om detta.



  1. MongoDB kapslad arraysökning med $map

  2. Steg för att installera MongoDB på Amazon Linux

  3. Hur konverterar man ett BasicDBO-objekt till ett Mongo-dokument med Java Mongo DB-drivrutinen version 3?

  4. MongoDB $literal