【问题标题】:MongoDB connection error from NodeJS backend using mongoose使用 mongoose 来自 NodeJS 后端的 MongoDB 连接错误
【发布时间】:2020-03-03 05:43:43
【问题描述】:

我已经部署了一个 mongodb 副本集,我正在尝试使用节点 js 后端应用程序连接到该副本集。 我的连接代码如下:

mongoose.connect(config.database, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  useCreateIndex: true,
  dbName:"db7_0",
  user:'****',
  pass:'****'

}).catch(function (err) {
  console.log('The connection to the database could not be established. Error details: ', err);
});

'config.database' 是我使用 mongodb 文档整理的连接 URL,如下所示:

  database: "mongodb://user:pw@xxx.eu-west-1.compute.amazonaws.com:27017,xxx.eu-west-1.compute.amazonaws.com:27017,xxx.eu-west-1.compute.amazonaws.com:27017/db7_0?replicaSet=rs0"

注意:“user”、“pw”和“xxx”只是我在连接字符串中使用的真实详细信息的占位符。

当我启动服务器并创建数据库连接时,我的日志显示以下内容:

我的应用程序抛出以下 MongoNetworkError:

The connection to the database could not be established. Error details:  MongoTimeoutError: Server selection timed out after 30000 ms
    at Timeout._onTimeout (C:\Dev\sc\node_modules\mongoose\node_modules\mongodb\lib\core\sdam\server_selection.js:308:9)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  name: 'MongoTimeoutError',
  [Symbol(mongoErrorContextSymbol)]: {}
}
Database error MongoTimeoutError: Server selection timed out after 30000 ms

我尝试了许多不同的方法来解决这个问题,例如在连接字符串中指定用户、密码和数据库以及 mongoose.connect 参数,但这没有任何区别。我最初使用的是 Mongoose v5.9.2(现在是 v5.8.2),行为仍然相同。

另外,请注意,在命令提示符下运行以下命令确实有效:

mongo "mongodb://user:pw@xx.xx.xxx.xx:27017/db7_0"

所以我怀疑这可能是一个猫鼬错误,但我正在努力找出问题所在。

【问题讨论】:

  • 副本集当前是否有主节点?
  • @Joe 是的。
  • 测试mongo "mongodb://user:pw@xx.xx.xxx.xx:27017/db7_0?replicaSet=rs0"
  • 这里有很多建议:github.com/Automattic/mongoose/issues/8180。您是否尝试过更新猫鼬?此外,有些人报告说注释掉 useUnifiedTopology 可以解决问题。
  • @Joe 您的建议让我找到了解决方案,谢谢!当我添加 replicaSet=rs0 选项时它不起作用。

标签: node.js mongodb mongoose replicaset


【解决方案1】:

原来我的问题是由replicaSet的配置引起的。 我已经使用每个成员的 ipv6 地址配置了副本集的每个成员,由于某种原因,这不允许我连接到副本集。然后我重新配置了副本集并将每个主机地址更改为每个成员的公共 DNS ipv4 地址,并且它工作了。

【讨论】:

  • 对此进行一些澄清:当您连接到副本集时,您在连接字符串中提供的主机只是一个种子列表。客户端/shell 将与这些节点中的 一个 建立连接,然后向该节点询问副本集成员的列表。然后它会断开原始连接并使用发现的主机信息重新连接。这意味着副本集配置中使用的主机地址必须是所有客户端都可以解析和访问的。
  • @Joe 谢谢你的解释。有助于从概念上理解副本集的实际情况:)
猜你喜欢
  • 2021-03-17
  • 1970-01-01
  • 2017-12-18
  • 2021-05-12
  • 1970-01-01
  • 2017-04-06
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多