sql >> Database teknologi >  >> NoSQL >> MongoDB

Håndtering af timeouts med Node.js og mongodb

UPD:
Baseret på dette indlæg ser det ud til, at de har implementeret en rettelse, der vil gøre det samme som det, vi gør her. Ikke sikker på, om dette allerede er inden for npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Efter nogle undersøgelser har jeg formået at forstå, hvad der foregår der:
Hver gang du kalder en hvilken som helst metode til at håndtere databasen (finde, opdatere, indsætte osv.), opretter den markør, der har eget ID og registrerer sig selv til EventEmitter af Db for senere at blive ringet tilbage. I mellemtiden registrerer det sig selv til _notReplied-objektet i samme CallBackStore.

Men når forbindelsen er lukket, kunne jeg ikke finde noget, der ville iterere gennem _notReplied-markører og ville udløse dem med fejl eller logik med timere (det kan stadig være et sted der). Så jeg har formået at skrive et lille arbejde rundt, som tvinger udløser markører med fejl, når DB udsender close begivenhed:

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

Jeg anbefaler at bruge den første tilgang i stedet for MongoClient. Årsagerne er få:for eksempel når du lukker forbindelsen og derefter ringer til .find det vil korrekt udløse fejl ved tilbagekald, mens det ikke gør det med MongoClient.

Hvis du bruger 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);
  }
});

Hvad vil dette gøre? Når forbindelsen er lukket, gentager den alle _notReplied-markører og udløser hændelser for dem med fejlen Connection Closed! .

Testtilfælde:

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

Det vil tvinge til at lukke databaseforbindelsen og udløse close begivenhed, som du håndterer tidligere og vil sørge for, at markøren vil blive lukket.

UPD:Jeg har tilføjet problem på GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 vi får se, hvad de siger om dette.



  1. Returnerer en tom række af indlæg, når du bruger mongoose populate

  2. Hvorfor kan jeg ikke finde en post af _id i mongodb

  3. Hvad er den anbefalede ækvivalent af kaskadedelt sletning i MongoDB for N:M-relationer?

  4. Bruger du JSON med MongoDB?