【问题标题】:Why is it that when connecting to MongoDB, Node.js driver version 3.0 or later does not work, but version 2.2.12 or later works?为什么连接MongoDB时,Node.js驱动3.0或更高版本不起作用,但2.2.12或更高版本可以?
【发布时间】:2020-07-31 18:48:50
【问题描述】:

当我尝试使用 Node.js 驱动程序 3.0 或更高版本连接到 MongoDB 时,出现错误:

UnhandledPromiseRejectionWarning:错误:QueryReqWrap.onresolve 处的 querySrv ENODATA_mongodb._tcp.nodeapi-qxd1n.mongo.net [as oncomplete] (dns.js:206:19)。

但是当我使用 Node.js 驱动程序2.2.12 时,我的数据库连接成功。我不知道为什么会这样,所以有人可以解释一下为什么会这样吗?谢谢!

【问题讨论】:

  • 这看起来很像 DNS 错误。您是否为两者使用相同的连接字符串?
  • 我只是在关注 MERN 堆栈上的教程,但是当我使用相同的步骤尝试它时,它不起作用。除非我将驱动程序更改为 2.2.12 或更高版本。
  • 你使用的是什么连接字符串?

标签: node.js mongodb


【解决方案1】:

Node.js 驱动程序版本 2.2.12 不支持 DNS 种子列表连接字符串格式,即mongodb+srv://,而 3.0 驱动程序支持。

错误信息表明您在 3.0 驱动程序中使用的连接字符串类似于

mongodb+srv://user:password@nodeapi-qxd1n.mongodb.net/database

为了使用它,驱动程序需要首先查找 SRV 和 TXT DNS 记录。这些看起来像这样:

% dig srv _mongodb._tcp.nodeapi-qxd1n.mongodb.net

;; ANSWER SECTION:
_mongodb._tcp.nodeapi-qxd1n.mongodb.net. 60 IN SRV 0 0 27017 nodeapi-shard-00-00-qxd1n.mongodb.net.
_mongodb._tcp.nodeapi-qxd1n.mongodb.net. 60 IN SRV 0 0 27017 nodeapi-shard-00-01-qxd1n.mongodb.net.
_mongodb._tcp.nodeapi-qxd1n.mongodb.net. 60 IN SRV 0 0 27017 nodeapi-shard-00-02-qxd1n.mongodb.net.

% dig txt nodeapi-qxd1n.mongodb.net

;; ANSWER SECTION:
nodeapi-qxd1n.mongodb.net. 60   IN  TXT "authSource=admin&replicaSet=NodeAPI-shard-0"

驱动程序使用该信息来构造标准连接字符串,例如

mongodb://user:password@nodeapi-shard-00-00-qxd1n.mongodb.net:27017,nodeapi-shard-00-01-qxd1n.mongodb.net:27017,nodeapi-shard-00-01 -qxd1n.mongodb.net/database?ssl=true&authSource=admin&replicaSet=NodeAPI-shard-0

这应该与您在 2.2.12 驱动程序中使用的连接字符串非常接近。

3.0 驱动程序失败,因为您的 DNS 解析没有响应对 SRV 记录的请求。

为了与较新的驱动程序连接,要么修复 DNS 问题,要么使用标准的 mongodb:// 连接字符串而不是 mongodb+srv:// 连接字符串。

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多