UPD:
Въз основа на тази публикация изглежда, че са разположили корекция, която ще направи същото като това, което правим тук. Не съм сигурен дали това вече е в рамките на npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13
След известно разследване успях да разбера какво се случва там:
Всеки път, когато извикате който и да е метод за работа с база данни (намиране, актуализиране, вмъкване и т.н.), той създава курсор, който има собствен идентификатор и се регистрира към EventEmitter на Db за обратно извикване по-късно. Междувременно той се регистрира към обект _notReplied в същия CallBackStore.
Но след като връзката е затворена, не можах да намеря нищо, което да преминава през _notReplied курсорите и да ги задейства с грешки или някаква логика с таймери (все още може да е някъде там). Така че успях да напиша малка работа, която принудително задейства курсори с грешка, когато DB излъчва close
събитие:
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)
}
});
Препоръчвам да използвате първия подход вместо MongoClient. Причините са няколко:например когато затворите връзка и след това извикате .find
правилно ще задейства грешка при обратно извикване, докато с MongoClient няма да го направи.
Ако използвате 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);
}
});
Какво ще направи това? След като връзката бъде затворена, тя ще премине през всички _notReplied курсори и ще задейства събития за тях с грешка Connection Closed!
.
Тестов случай:
items.find({ }).toArray(function(err, data) {
if (!err) {
console.log('Items found successfully');
} else {
console.log(err);
}
});
db.close();
Това ще принуди да затвори връзката с базата данни и ще задейства close
събитие, което обработите по-рано и ще се уверите, че курсорът ще бъде затворен.
UPD:Добавих проблем в GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 ще видим какво ще кажат по въпроса.