从Node(Express)处理MongoDB连接问题
我有一个快速应用程序,它在启动时连接到MongoDB服务器,并按需提供请求(我不断开 – 这是一个单线程服务器,所以没有池 – 很简单的东西)
问题在于MongoDB服务器可能会在一段时间内不可用(不在现场),而Express App不会崩溃,似乎任何对服务器的请求都将无限期运行,直到连接恢复!
我想限制这个(例如,在一段时间后抛出一个错误),但我似乎无法做到这一点…
我使用连接选项“{server:{auto_reconnect:true}}”,似乎确保一旦MongoDB服务器重新出现,请求就完成了(没有它,在停机期间发出的请求似乎永远运行…)无法访问客户端代码,所以我无法修复它…
我假设一个'connectTimeoutMS'或'socketTimeoutMS'的组合将允许我终止请求,当MongoDB长时间不可用时,但我不能让这些工作(我已经尝试了它们作为连接选项,通过它们在URI等等)
在MongoDB重新出现之前,任何打开一个Collection和Find / Insert / Update的尝试都会“挂起” – 我已经离开了30多分钟,所有事情都只是坐在这里(并且在networking恢复的时候完成了AOK)!
什么是最好的方法呢? 我应该专门为每个请求打开一个连接(不是真正的性能问题 – 这不是一个高容量的应用程序)还是有什么我失踪?
更新以添加连接代码
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()调用(或者调用查找/插入的句柄)将会挂起,直到连接恢复 – 我已经尝试过的任何东西都将导致它们更快地超时。 ?
我假设你正在使用mongoose作为驱动程序。
你会发现这个错误。
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 =断开连接
每个状态更改都会发出其关联的事件名称。