使用 mongodb 4.x 节点驱动程序连接到 documentDB,端口转发不起作用
Connecting to documentDB using mongodb 4.x node driver with port forwarding not working
我已经在本地设置了一个端口转发到在 mongodb 驱动程序版本 3.x 上成功运行的 documentDB。当我将 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 包时成功连接)
连接到副本集时,驱动程序:
- 使用连接字符串中的主机作为初始连接的种子。
- 在该初始连接上运行
isMaster
或 hello
命令以获取 host:port 副本集成员的完整列表及其当前状态
- 丢弃初始连接
- 连接到步骤 #2 中发现的每个成员
- 在操作期间,自动监控所有成员,即使不同的节点成为主节点也将操作发送到主节点
在您的场景中,即使您正在连接到 localhost
,初始连接 returns host:port 对包含在副本集配置中。
这刚刚成为问题的原因是 MongoDB 驱动程序规范更改为默认使用统一拓扑。
统一拓扑允许驱动程序自动检测它是连接到独立实例、副本集还是分片集群,这简化了连接过程并减少了更改数据库部署方式时所需的管理开销。
由于您的连接失败,我假设副本集配置中列出的 hostname:port 对无法解析或无法从测试主机访问。
要解决这种情况:
- 使这台机器可以通过 DNS 或主机文件解析主机名,并允许通过任何防火墙连接到这些端口
- 使用
directConnection=true
connection option 禁用拓扑发现
我已经在本地设置了一个端口转发到在 mongodb 驱动程序版本 3.x 上成功运行的 documentDB。当我将 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 包时成功连接)
连接到副本集时,驱动程序:
- 使用连接字符串中的主机作为初始连接的种子。
- 在该初始连接上运行
isMaster
或hello
命令以获取 host:port 副本集成员的完整列表及其当前状态 - 丢弃初始连接
- 连接到步骤 #2 中发现的每个成员
- 在操作期间,自动监控所有成员,即使不同的节点成为主节点也将操作发送到主节点
在您的场景中,即使您正在连接到 localhost
,初始连接 returns host:port 对包含在副本集配置中。
这刚刚成为问题的原因是 MongoDB 驱动程序规范更改为默认使用统一拓扑。
统一拓扑允许驱动程序自动检测它是连接到独立实例、副本集还是分片集群,这简化了连接过程并减少了更改数据库部署方式时所需的管理开销。
由于您的连接失败,我假设副本集配置中列出的 hostname:port 对无法解析或无法从测试主机访问。
要解决这种情况:
- 使这台机器可以通过 DNS 或主机文件解析主机名,并允许通过任何防火墙连接到这些端口
- 使用
directConnection=true
connection option 禁用拓扑发现