在我的测试中,我使用以下node.js脚本:
var mongo = require('mongodb');
var Promise = require('bluebird');
Promise.promisifyAll(mongo);
var mongoCollection;
function query() {
mongoCollection.findAsync({}, { limit: 2 })
.then(function (cursor) {
return cursor.toArrayAsync();
})
.then(function (records) {
console.log("got data");
})
.catch(function (e) {
console.log("promise error: " + e);
});
}
function connect() {
mongo.MongoClient.connectAsync('mongodb://127.0.0.1:27017/test', {
server: {
auto_reconnect: true
}
})
.then(function (db) {
mongoCollection = db.collection("users");
setInterval(function () {
query();
}, 2000);
db.on('error', function () {
console.log("db error");
});
}).catch(function (e) {
console.log("connection error: " + e);
});
}
connect();
它每2秒打印一次“获取数据”,直到我关闭mongoDB服务器。此时,驱动程序尝试重新连接(auto_reconnect:true)。但是,它发生在无限循环中。看一下驱动程序源代码,我在/lib/mongodb/connection/server.js中看到,有一个函数__attemptReconnect。它会调用自身,直到配置的重新连接尝试次数完成。之后,它会发出“错误”事件。此事件在连接池级别捕获。连接池重置重新连接尝试计数器并再次调用此功能。等等,直到服务器再次启动。
这似乎是一个微不足道的用例。如果重新连接尝试在几秒钟内没有成功,我希望我的数据库客户端收到错误。没有解决方案的解决方案,只使用适当的设置是否可能?我只是错过了一些东西吗?我知道那里有类似的问题,但我没有找到任何答案。