UPD:
Com base neste post, parece que eles implantaram uma correção que fará o mesmo que fazemos aqui. Não tenho certeza se isso já está dentro do npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13
Após algumas investigações consegui entender o que está acontecendo lá:
Toda vez que você chama qualquer método para lidar com banco de dados (localizar, atualizar, inserir, etc.) ele cria um cursor, que tem ID próprio e se registra para EventEmitter de Db para ser chamado de volta mais tarde. Enquanto isso, ele se registra no objeto _notReplied dentro do mesmo CallBackStore.
Mas uma vez que a conexão é fechada, não consegui localizar nada que iterasse através dos cursores _notReplied e os acionasse com erros ou qualquer lógica com temporizadores (ainda pode estar em algum lugar). Então eu consegui escrever um pequeno trabalho em torno, que força os cursores acionadores com erro quando o banco de dados emite
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)
}
});
Eu recomendo usar a primeira abordagem em vez do MongoClient. Os motivos são poucos:por exemplo, quando você fecha a conexão e chama
.find
ele acionará corretamente o erro no retorno de chamada, enquanto com o MongoClient não. Se você estiver usando o 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);
}
});
O que isso vai fazer? Uma vez que a conexão é fechada, ela irá percorrer todos os cursores _notReplied e acionar eventos para eles com o erro
Connection Closed!
. Caso de teste:
items.find({ }).toArray(function(err, data) {
if (!err) {
console.log('Items found successfully');
} else {
console.log(err);
}
});
db.close();
Isso forçará o fechamento da conexão com o banco de dados e acionará
close
evento que você manipula anteriormente e garantirá que o cursor seja fechado. UPD:adicionei um problema no GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 vamos ver o que eles dizem sobre isso.