sql >> Databáze >  >> NoSQL >> MongoDB

Zpracování časových limitů pomocí Node.js a mongodb

UPD:
Na základě tohoto příspěvku to vypadá, že nasadili opravu, která bude dělat totéž, co děláme zde. Nejste si jisti, zda je to již v rámci npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Po nějakém zkoumání se mi podařilo pochopit, co se tam děje:
Pokaždé, když zavoláte jakoukoli metodu pro práci s databází (najít, aktualizovat, vložit atd.), vytvoří kurzor, který má vlastní ID a zaregistruje se EventEmitter of Db za to, že byl později zavolán zpět. Mezitím se zaregistruje do objektu _notReplied ve stejném CallBackStore.

Ale jakmile je připojení uzavřeno, nemohl jsem najít nic, co by iterovalo přes kurzory _notReplied a spouštělo by je chybami nebo jakoukoli logikou s časovači (stále by to někde mohlo být). Takže se mi podařilo napsat malou práci kolem, která vynucuje spouštění kurzorů s chybou, když DB generuje close událost:

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

Doporučuji použít první přístup místo MongoClient. Důvodů je málo:například když uzavřete spojení a pak zavoláte .find správně spustí chybu při zpětném volání, zatímco u MongoClient ne.

Pokud používáte 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);
  }
});

Co to udělá? Jakmile je připojení uzavřeno, bude procházet všemi kurzory _notReplied a spouští pro ně události s chybou Connection Closed! .

Testovací případ:

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

To vynutí uzavření připojení k databázi a spustí close událost, kterou zpracujete dříve, a zajistí, že se kurzor zavře.

UPD:Na GitHubu jsem přidal problém:https://github.com /mongodb/node-mongodb-native/issues/1092 uvidíme, co na to řeknou.



  1. Jak mohu upravit/přejmenovat klíče během json.load v pythonu?

  2. Jak filtrovat kolekci na základě každé položky pole v poli dokumentu v Mongodb

  3. Jak importovat soubor Geojson do MongoDB

  4. Získat _id vloženého dokumentu v MongoDB?