node.js - 从 Node (Express) 处理 MongoDB 连接问题

标签 node.js mongodb express

我有一个 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.

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

关于node.js - 从 Node (Express) 处理 MongoDB 连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533789/

相关文章:

mongodb - Scala 从 Controller 接收列表 [String]

c# - 在 MongoDB 中按部分 _id 值查找/计算文档

node.js - 错误 : options. uri 是必需的参数

node.js - 对象内存泄漏(当 nodejs 配置为最大 512M 时,Heroku 内存使用量达到 1.5 GB)

javascript - Twitter typehead.js 显示整个查询,而不仅仅是值

node.js - npm 错误! azure devops 中的代码 ELIFECYCLE 无法使其运行

javascript - setInterval 是 'pausing' 导航

node.js - 无法使用 NodeJS 从表中检索数据。错误: ORA-12560: TNS:protocol adapter error

javascript - MongoDB:为什么 Array.find on comments(数组)属性返回未定义?

javascript - 即使设置了 header , Node 原点也是如此