处理来自 Node (Express) 的 MongoDB 连接问题

Handing MongoDB connection issues from Node (Express)

我有一个 Express 应用程序,它在启动时连接到 MongoDB 服务器并处理请求 on-demand(我没有断开连接 - 它是一个单线程服务器,所以没有池 - 相当简单的东西)

问题是 MongoDB 服务器可能会在一段时间内不可用(不是 on-site),虽然 Express App 没有崩溃,但似乎对服务器将 运行 不确定,直到连接恢复!

我想对此进行限制(例如,在一段时间后返回错误)但我似乎无法做到这一点...

我正在使用连接选项“{server: {auto_reconnect: true}}”这似乎确保一旦 MongoDB 服务器重新出现,请求完成(没有它,请求在停机时间似乎 运行 永远......) - 我无法访问客户端代码,所以我无法在那里修复它......

我假设 'connectTimeoutMS' 或 'socketTimeoutMS' 的组合允许我在 MongoDB 长时间不可用时终止请求,但我无法让这些工作(我试过将它们作为连接选项,在 URI 等中传递它们)

任何打开 Collection 和 Find/Insert/Update 的尝试都只是 'hangs' 直到 MongoDB 重新出现 - 我已经离开它超过 30 分钟,一切都只是坐着这些(并在网络恢复时完成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 然后在其他地方使用来打开 collections - 并且来自它的句柄用于 find/insert 等

如果与数据库的连接中断,myDB.collection() 调用(或在其句柄上调用 find/insert)将简单地挂起,直到连接恢复——我没有尝试过让他们 'time out' 更快!?

我假设您正在使用 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

检查你的数据库的语句。

Connection ready state

0 = disconnected

1 = connected

2 = connecting

3 = disconnecting

Each state change emits its associated event name.

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