我有一个Express App,它在启动时连接到MongoDB服务器并按需提供请求(我不断开连接 - 它是一个单线程服务器,所以没有汇集 - 相当简单的东西)
问题是MongoDB服务器可能在一段时间内不可用(它不在现场),而Express App不会崩溃,似乎任何对服务器的请求都将无限期地运行,直到连接恢复了!
我想限制一下(例如在一段时间后抛回错误),但我似乎无法实现这一点......
我正在使用连接选项“{server:{auto_reconnect:true}}”这似乎确保一旦MongoDB服务器再次出现,请求就完成了(没有它,在停机期间发出的请求似乎永远都会运行......) - 而且我无法访问客户端代码,所以我无法在那里修复它...
我假设'connectTimeoutMS'或'socketTimeoutMS'的组合允许我在MongoDB长时间不可用时终止请求,但我无法让它们工作(我已经尝试过它们作为连接选项) ,在URI等中传递它们。)
任何尝试打开收集和查找/插入/更新只是'挂起'直到MongoDB重新出现 - 我已经离开它超过30分钟,一切都只是坐在这些(并在网络恢复时完成了AOK!)< / p>
最好的方法是什么?我应该专门为每个请求打开一个连接(不是真正的性能问题 - 它不是一个高容量的应用程序)还是还有其他我缺少的东西?
已更新以添加连接代码
var myDB
var mongodb = require('mongodb')
var uri = // some env vars and stuff
mongodb.MongoClient.connect(uri, {server: {auto_reconnect: true}}, function (err, db) {
myDB = db
})
然后在其他地方使用myDB打开集合 - 其中的句柄用于查找/插入等。
如果与数据库的连接中断,myDB.collection()调用(或在其句柄上调用find / insert)将一直挂起,直到连接恢复为止 - 我尝试的任何内容都不会导致它们'超时' '早点!?
答案 0 :(得分:2)
我假设您使用猫鼬作为驱动程序。
你会发现错误。
var db = require('domain').create();
db.on('error', function(err) {
console.log('DB got a problem');
});
db.run(function() {
mongoose.connect(config, options);
});
或者您可以直接访问
mongoose.connection.readyState
检查数据库的声明。
连接就绪状态
0 =已断开连接
1 =已连接
2 =连接
3 =断开连接
每个状态更改都会发出相关的事件名称。