我有一个 Express 应用程序,它在启动时连接到 MongoDB 服务器并按需提供请求(我不会断开连接 - 这是一个单线程服务器,因此没有池 - 相当简单的东西)
问题是 MongoDB 服务器可能会在一段时间内不可用(它不在现场),并且虽然 Express 应用程序不会崩溃,但似乎向服务器发出的任何请求都将无限期地运行,直到连接恢复为止!
我想限制这一点(例如,在一段时间后抛出错误),但我似乎无法做到这一点......
我正在使用连接选项“{server: {auto_reconnect: true}}”,这似乎可以确保一旦 MongoDB 服务器重新出现,请求就会完成(没有它,在停机期间发出的请求似乎会永远运行......) - 而且我无权访问客户端代码,所以我无法在那里修复它......
我假设“connectTimeoutMS”或“socketTimeoutMS”的组合允许我在 MongoDB 长时间不可用时终止请求,但我就是无法让它们工作(我已经尝试将它们作为连接选项,将它们传递到 URI 等)
任何打开集合和查找/插入/更新的尝试都会“挂起”,直到 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 来打开集合 - 并且其中的句柄用于查找/插入等。
如果与数据库的连接中断,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
检查您的数据库的语句。
Connection ready state
0 = disconnected
1 = connected
2 = connecting
3 = disconnecting
Each state change emits its associated event name.
关于node.js - 从 Node (Express) 处理 MongoDB 连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533789/