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.