node.js - 使用 mongodb 4.x Node 驱动程序连接到 documentDB,端口转发不起作用

标签 node.js mongodb aws-documentdb

我在本地设置了一个到 documentDB 的端口转发,该端口在 mongodb 驱动程序版本 3.x 上成功运行。当我将 mongodb 包更新到 4.x 时,我收到超时错误,原因是 ReplicaSetNoPrimary。

代码很简单:

const MongoClient = require('mongodb').MongoClient;


const client = new MongoClient('mongodb://xxxx:xxxx@localhost:27017');


client.connect(function(err) {
  if (err) {
    console.log(err);
    return;
  }
  
  const db = client.db('testdb');

  console.log("Connected successfully to server");

  client.close();
});

有人能够使用 4.x 驱动程序的端口转发在本地连接到 documentDB 吗?我是否缺少某种配置选项? (请记住,我已禁用所有 tls 和所有内容,以使连接更简单,并且如前所述,使用 mongodb 3.x 包时成功连接)

最佳答案

当连接到副本集时,驱动程序:

  1. 使用连接字符串中的主机作为种子来建立初始连接。
  2. 在初始连接上运行 isMasterhello 命令以获取 host:port 副本集成员的完整列表及其当前状态
  3. 断开初始连接
  4. 连接到第 2 步中发现的每个成员
  5. 在操作期间,自动监视所有成员,即使不同的 Node 成为主 Node ,也会将操作发送到主 Node

在您的场景中,即使您连接到 localhost,初始连接也会返回副本集配置中包含的主机:端口对。

这只是成为一个问题的原因是 MongoDB 驱动程序规范更改为默认使用统一拓扑。

统一拓扑允许驱动程序自动检测它是否正在连接到独立实例、副本集或分片集群,这简化了连接过程并减少了更改数据库部署方式时所需的管理开销。

由于您的连接失败,我假设副本集配置中列出的主机名:端口对无法解析或无法从测试主机访问。

要解决这种情况:

  • 使该计算机可以通过 DNS 或主机文件解析主机名,并允许通过任何防火墙连接到这些端口
  • 使用directConnection=true connection option禁用拓扑发现

关于node.js - 使用 mongodb 4.x Node 驱动程序连接到 documentDB,端口转发不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70187481/

相关文章:

node.js - 使用 Redis 作为 session 存储的 NodeJs 抛出异常

javascript - MongoDB 无法更新文档,因为 _id 是字符串,而不是 ObjectId

javascript - 云代码函数未使用 Parse 服务器开源 API 执行

javascript - 如何通过 promise 关闭mongo中的连接?

amazon-web-services - EC2 实例不会连接到不同可用区中的 DocumentDB。为什么?

javascript - 匹配 react 路由器路径声明的正则表达式

MongoDB 删除返回 nRemoved 0

javascript - 如何在 MongoDb .aggregate() 中的 $lookup 中添加条件?

mongodb - AWS DocumentDB 是否支持在单个查询中加入 3 个以上的集合?

c# - 如何使用 Mongo 命令对 DocumentDB 中的文档执行 "patch"操作