连接到 MongoDb Atlas 服务器时出错
Posted
技术标签:
【中文标题】连接到 MongoDb Atlas 服务器时出错【英文标题】:Error at connecting to MongoDb Atlas Server 【发布时间】:2018-09-28 09:54:24 【问题描述】:所以我目前正在编写一个 Web 应用程序并且我需要数据库,所以我决定使用 mongodb 和 mongoose。到目前为止,我在 localhost 上测试了所有内容并且它工作正常,但我想将数据移动到服务器。我听说过 Atlas 并注册了自己并“上传”了数据。
现在我想通过 node.js 应用程序连接到集群。
mongoose.connect('mongodb+srv://engllucas:p%40ssw0rd@insight-quhku.mongodb.net/test');
我在 Connect Your Application
处得到了 mongodb Atlas 站点的字符串然后我换了密码。
mongoose.connect('mongodb://engllucas:p%40ssw0rd@insight-quhku.mongodb.net/test');
这也没用。
这是错误信息:
MongoError: failed to connect to server [insight-shard-00-02-quhku.mongodb.net:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 18.194.163.64:27017]
at Pool.<anonymous> (U:\WEBT\ProjectInsight\Quiz\node_modules\mongodb-core\lib\topologies\server.js:503:11)
at emitOne (events.js:115:13)
at Pool.emit (events.js:210:7)
at Connection.<anonymous> (U:\WEBT\ProjectInsight\Quiz\node_modules\mongodb-core\lib\connection\pool.js:326:12)
at Object.onceWrapper (events.js:318:30)
at emitTwo (events.js:125:13)
at Connection.emit (events.js:213:7)
at TLSSocket.<anonymous> (U:\WEBT\ProjectInsight\Quiz\node_modules\mongodb-core\lib\connection\connection.js:245:50)
at Object.onceWrapper (events.js:316:30)
at emitOne (events.js:115:13)
at TLSSocket.emit (events.js:210:7)
at emitErrorNT (internal/streams/destroy.js:64:8)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
name: 'MongoNetworkError',
消息:'第一次连接时无法连接到服务器 [insight-shard-00-02-quhku.mongodb.net:27017] [MongoNetworkError: connect ECONNREFUSED 18.194.163.64:27017]' (节点:4920)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):MongoNetworkError:第一次连接时无法连接到服务器[insight-shard-00-02-quhku.mongodb.net:27017] [MongoNetworkError:连接ECONNREFUSED 18.194 .163.64:27017] (节点:4920)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
【问题讨论】:
【参考方案1】:如果您使用的是 5.0.15 之前的 mongoose:
mongodb+srv://
uri 对底层原生驱动无效。
仅删除 +srv 也不起作用,因为 uri 需要包含您的副本主机和 replicaSet/authSource 参数。
你可以
1.升级到 mongoose 5.0.15 并使用更短的 +srv 格式
或
2。使用当前版本和 Atlas 集群仪表板中的完整 uri,选择较旧的驱动程序(请参阅下面的注意)版本 uri。
在您的集群仪表板中,按连接按钮,然后(假设您已将节点服务器的 IP 列入白名单)选择“连接您的应用程序”,然后按“我正在使用 3.4 或更早版本的驱动程序”。使用生成的 uri 字符串替换您的密码。
注意:在 Atlas 集群仪表板上的连接帮助程序中选择 URI 字符串的对话框中,它说 “我正在使用驱动程序 3.* 或(较新|较旧)”。这是一个糟糕的词选择,因为 3.6 和 3.4 不是指驱动程序版本,而是服务器版本。此外,使用服务器的一个版本或另一个版本与用于连接的驱动程序无关,这是决定使用哪个版本的 URI 的实际依赖关系所在。
【讨论】:
可能值得注意的是,这是对 3.x 系列节点驱动程序的依赖,只有更新的 mongoose 版本实际使用它。 atlas 仪表板实际上是否显示 ""我使用的是 3.4 或更早版本的驱动程序"。?因为如果这是与节点驱动程序相关的文本,这有点误导,因为当前的驱动程序版本是3.0.6
而不是3.4
.
是的,它要求您在“3.6 或更高版本”和“3.4 或更高版本”之间进行选择。有点奇怪。从我在连接您的应用程序对话框链接到的文档中可以看出... 3.6 和 3.4 指的是 MongoDB 的版本,而不是驱动程序:docs.atlas.mongodb.com/driver-connection(此页面上的选项卡明确表示 MongoDB 服务器3.6,4)
我推测 3.4
确实指的是 server,这就是为什么我质疑文本实际上是 driver 正如你所引用的。所以它实际上根本没有说 driver ,这只是你的答案中的错误引用。现在明白了吗?
它确实说“我正在使用驱动程序 3.4 或更早版本”这是对话框的屏幕截图; dropbox.com/s/v7dwlfpx1ymqpjy/… 所以我想这是我评论中的错误引用,而不是我的答案:)
好吧。无论哪种方式,都是错误的。因此,澄清了实际依赖关系在哪里。【参考方案2】:
我也遇到了类似的问题,我可以通过在集群 -> 安全 -> IP 白名单下添加我的 IP 地址白名单来解决它。不用点击my current ip address
,只需在谷歌上搜索我的 ip 并粘贴即可。
我希望它有效!
【讨论】:
来自 mongodb 的可悲异常没有显示正确的消息是什么问题。谢谢你的回答有效 我试过了,但我仍然无法得到回应 上述解决方案有效,如果仍然无效,请尝试禁用您的防病毒软件并重试。 我在将 ip 添加到 mongodb 白名单时使用了“使用我当前的 ip”选项,然后工作。但是您的回答帮助我理解问题是 ip 而不是我的代码。【参考方案3】:这是您的“IP 白名单”的问题。编辑和更新一次,它应该可以正常工作。
【讨论】:
【参考方案4】:我遇到了类似的问题,无法连接到 mongo。显然 mongodb 不喜欢我包含特殊字符的密码。我尝试进行 URL 编码和所有其他类型的操作,但最终证明为我解决问题的只是将密码更改为不使用特殊字符的密码。我使用了 mongodb 密码生成器,现在一切正常。
【讨论】:
【参考方案5】:显然,正在改变
mongoose.connect(keys.mongoURI);
到
mongoose.connect(keys.mongoURI, () => , useNewUrlParser: true )
.catch(err =>
console.log(err);
);
为我工作。
【讨论】:
【参考方案6】:检查您当前的 IP 地址是否在 MongoAtlas IP 白名单中。我在更新 *** 后遇到了这个问题。
【讨论】:
【参考方案7】:google => 我的 ip 地址 => 复制
进入 Atlas => 进入集群选项卡后,查看左侧 => 安全 => 网络访问 => 编辑 Ip => 粘贴 IP 地址。
重新运行你的服务器,它应该可以工作了 :)
【讨论】:
【参考方案8】:上面的答案是对的,但我想补充一点:
从安全角度来看,这并不好;
我也遇到了类似的问题,我可以通过在Clusters -> security -> IP Whitelist.
下添加我的 IP 地址来解决它相反。我希望它有效!
我也遇到了类似的问题,我可以通过在Clusters -> security -> IP Whitelist.
下添加我的 IP 地址的白名单来解决这个问题,在列表中添加了这个 IP:0.0.0.0/0
它将向所有人开放。
【讨论】:
【参考方案9】:我在连接到 MongoDB Atlas 集群时遇到了这个问题。我不得不两次解决这个问题,因为我正在使用两台不同的计算机(Macbook Pro 和 Windows PC)处理一个项目。
这是我为解决我的应用程序未连接到集群的问题而想出的所有内容的综合答案。
第一 确保您的 IP 像上述建议一样被列入白名单。最简单的解决方案是 0.0.0.0/0 的“所有 IP”白名单
第二 如果您使用的是 ***,请检查您的 ***。我在连接到 *** 时尝试连接到集群。关闭***后,我就可以连接了。
第三 确保您的 Internet 设置不会阻止您连接到集群。我家的 Xfinity wifi 安全设置设置得太高,导致无法连接。我认为路由器不允许连接到端口 27017。测试是否发生此问题的一种方法是将您的计算机连接到您的手机以进行互联网而不是您的 wifi 并尝试连接。我能够使用我的 iPhone 作为互联网热点进行连接。我将路由器重置为出厂设置以解决问题。
【讨论】:
第三个解决方案对我有用。这实际上是我的 wifi 安全设置,在我切换到手机热点后它对我有用。感谢@prestondoris 第三个解决方案也对我有用。连接到手机热点后,我就可以连接到我的 Atlas 服务器了。 很高兴这对你们俩都有效。我用头撞墙了大约一个月,试图弄清楚我的问题是什么。 前一天我可以通过移动 USB 网络共享进行连接,但今天同样的连接对我不起作用。第一个解决方案对我有用。会不会有安全问题?我将它用于我的个人项目,学习 mongodb。谢谢! 我对第二点有问题。当断开与 *** 的连接时,我能够连接,当连接到 *** 时,它会引发错误。【参考方案10】:我遇到了同样的问题,但 IP 白名单设置正确!
原因是,MongoDB Enterprise Atlas 需要 SSL 加密层尝试在没有它的情况下连接,会产生不合理且不自我解释的错误,例如:
Failed to connect to mongodb-m0-nnxxx.mongodb.net:27017
No chance to Authorize
尝试使用 mondodb 客户端连接,但 IP 白名单是问题,出现如下错误消息:
mongo "mongodb+srv://mongodb-m0-nnxxx.mongodb.net/test" --username admin
DBClientConnection failed to receive message from mongodb-m0-shard-00-00-nnxxx.mongodb.net.:27017 - HostUnreachable: Connection closed by peer
Unable to reach primary for set mongodb-m0-shard-0
Cannot reach any nodes for set mongodb-m0-shard-0. Please check network connectivity and the status of the set. This has happened for 5 checks in a row.
例如使用 Robo 3T 客户端,必须启用复选框“使用 SSL 协议”,并且 **认证方式:自签名证书**
测试产生诊断输出:
v Connected to mongodb-m0-nnxxx.mongodb.net:27017 via SSL tunnel
v Authorized on admin database as admin
希望这对某人有所帮助。
【讨论】:
【参考方案11】:我遇到了这个问题,我解决了它。以下是我使用的步骤:
-
首先在mongodb中添加新用户(安全>数据库访问>添加新用户>)
然后将新用户名和密码写入 .env 文件。
杀死服务器并重新运行服务器。
这是对我有用的解决方案。
【讨论】:
【参考方案12】:在将 MongoDB Compass 连接到 https://cloud.mongodb.com/ 集群时,我也遇到了类似的问题。
以下步骤可解决此问题。
-
访问 google.com > 输入我的 IP 地址 > 复制您的系统/网络的公共 IP 地址
转到https://cloud.mongodb.com/集群>选择安全>网络访问>点击IP whilelist选项卡>添加IP地址>输入您的公共IP地址。
【讨论】:
【参考方案13】:我在意识到之前连接了 ***。当我稍后尝试连接到 db 时,我无法做到。我再次打开了自己的绳索和权限中的所有权限。然后当我再次连接vpm时,我能够连接。
【讨论】:
【参考方案14】:我也有类似的问题。然后变了
mongoose.connect(db, () => , useNewUrlParser: true )
.catch(err => console.log(err););
但产生了错误,
(node:5796) DeprecationWarning: 当前 URL 字符串解析器是 已弃用,并将在未来的版本中删除。要使用新 解析器,将选项 useNewUrlParser: true 传递给 MongoClient.connect。
然后把代码改成
mongoose.connect(db, useNewUrlParser: true, useUnifiedTopology: true , () => )
.catch(err => console.log(err));
这对我有用。
【讨论】:
【参考方案15】:如果您已连接到热点,并且认为您已正确完成所有操作,请断开连接并重新连接。尤其是关闭您的互联网连接并重新连接。
【讨论】:
【参考方案16】: 我也遇到了同样的错误,我尝试了这个逻辑。 除此之外在 netwrok Access 的 mongoDb atlas 中,配置所有 ip地址。并将其设置为---------------- 0.0.0.0/0【讨论】:
【参考方案17】:我最终解决了这个问题,只需将“+srv”添加到连接字符串的开头,如下所示:
mongoose.connect("mongodb+srv://<username>:<password>@<address>/<database>?retryWrites=true&w=majority", useNewUrlParser: true);
这很奇怪,因为我发现几个答案指示我做相反的事情。我想我把我的猫鼬版本弄混了。
希望这对某人有所帮助。
【讨论】:
成功了,感谢修复【参考方案18】:奇怪但更改集群的密码(一个没有特殊符号的密码)有帮助。
【讨论】:
【参考方案19】:我有同样的问题,添加到白名单和其他解决方案没有帮助。但是在我创建了另一个用户之后。在“Database User Privileges”字段中创建新用户时,我选择了“Atlas admin”而不是默认的“Read and write to any database”。之后,连接工作了
【讨论】:
以上是关于连接到 MongoDb Atlas 服务器时出错的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 MEAN 堆栈连接到 Mongodb.atlas 集群
将 Heroku App 连接到 Atlas MongoDB 云服务