从Node(Express)处理MongoDB连接问题

时间:2015-02-16 02:39:42

标签: node.js mongodb express

我有一个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)将一直挂起,直到连接恢复为止 - 我尝试的任何内容都不会导致它们'超时' '早点!?

1 个答案:

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

     

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

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