MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Behandlung von Zeitüberschreitungen mit Node.js und mongodb

UPD:
Basierend auf diesem Beitrag sieht es so aus, als hätten sie einen Fix bereitgestellt, der dasselbe tut wie das, was wir hier tun. Nicht sicher, ob dies bereits in npm (15.10.13) enthalten ist. https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Nach einigen Nachforschungen habe ich es geschafft zu verstehen, was dort vor sich geht:
Jedes Mal, wenn Sie eine Methode aufrufen, um mit der Datenbank umzugehen (finden, aktualisieren, einfügen usw.), erstellt sie einen Cursor, der eine eigene ID hat und sich selbst registriert an EventEmitter von Db für einen späteren Rückruf. In der Zwischenzeit registriert es sich selbst beim _notReplied-Objekt innerhalb desselben CallBackStore.

Aber sobald die Verbindung geschlossen ist, konnte ich nichts finden, was _notReplied-Cursor durchlaufen und sie mit Fehlern oder irgendeiner Logik mit Timern auslösen würde (es könnte immer noch irgendwo dort sein). Also habe ich es geschafft, eine kleine Arbeit zu schreiben, die Trigger-Cursor mit Fehlern erzwingt, wenn DB close ausgibt Ereignis:

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

Ich empfehle die Verwendung des ersten Ansatzes anstelle von MongoClient. Es gibt wenige Gründe:zum Beispiel, wenn Sie die Verbindung schließen und dann .find aufrufen Es löst beim Rückruf ordnungsgemäß einen Fehler aus, während dies bei MongoClient nicht der Fall ist.

Wenn Sie MongoClient verwenden:

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

Was wird das bewirken? Sobald die Verbindung geschlossen ist, durchläuft sie alle _notReplied-Cursor und löst Ereignisse für sie mit dem Fehler Connection Closed! aus .

Testfall:

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

Das erzwingt das Schließen der Datenbankverbindung und löst close aus Ereignis, das Sie zuvor behandelt haben, und stellt sicher, dass der Cursor geschlossen wird.

UPD:Ich habe ein Problem auf GitHub hinzugefügt:https://github.com /mongodb/node-mongodb-native/issues/1092 wir werden sehen, was sie dazu sagen.