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

Gestione dei timeout con Node.js e mongodb

UPD:
Sulla base di questo post, sembra che abbiano implementato una correzione che farà lo stesso di quello che facciamo qui. Non sono sicuro che sia già entro npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Dopo alcune indagini sono riuscito a capire cosa sta succedendo lì:
Ogni volta che chiami un metodo per gestire il database (trova, aggiorna, inserisci, ecc.) crea un cursore, che ha un proprio ID e si registra a EventEmitter di Db per essere richiamato in seguito. Nel frattempo si registra nell'oggetto _notReplied all'interno dello stesso CallBackStore.

Ma una volta chiusa la connessione, non sono riuscito a individuare nulla che iterasse attraverso i cursori _notReplied e li attiverebbe con errori o qualsiasi logica con timer (potrebbe ancora essere da qualche parte lì). Quindi sono riuscito a scrivere un piccolo lavoro in giro, che forza i cursori di attivazione con errore quando DB emette close evento:

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

Consiglio di utilizzare il primo approccio invece di MongoClient. I motivi sono pochi:ad esempio quando chiudi la connessione e poi chiami .find attiverà correttamente l'errore nella richiamata, mentre con MongoClient non lo farà.

Se stai usando 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);
  }
});

Cosa farà? Una volta chiusa la connessione, eseguirà un'iterazione attraverso tutti i cursori _notReplied e attiverà eventi per loro con errore Connection Closed! .

Caso di prova:

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

Ciò forzerà la chiusura della connessione al database e attiverà la close evento che gestisci in precedenza e farà in modo che il cursore venga chiuso.

UPD:Ho aggiunto il problema su GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 vedremo cosa diranno in merito.