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.