从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 =断开连接

每个状态更改都会发出其关联的事件名称。

http://mongoosejs.com/docs/api.html