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.