MongoNetworkError:第一次连接时无法连接到服务器[mongodb:27017]

14ifxucb  于 2023-11-17  发布在  Go
关注(0)|答案(4)|浏览(244)

x1c 0d1x的数据
我正在参加一个初级Docker课程(https://www.youtube.com/watch?v=3c-iBn73dDE&t=4384s),我认为这个课程做得很好。
作为课程的一部分,应用程序与节点服务器和js前端放在一起,与mongo db和mongo express的docker容器通信以实现持久性。
节点应用程序可以在https://gitlab.com/nanuchi/techworld-js-docker-demo-app/-/blob/master/app/server.js上找到。包含:

MongoClient.connect("mongodb://admin:password@mongodb:27017", 
function (err, client) {
if (err) throw err;

var db = client.db('user-account');
userObj['userid'] = 1;

字符串
我在Chromebook上运行了两个在ubuntu 20.04上运行的docker容器(截图)。当我运行时:

11@penguin:~/techworld-js-docker-demo-app/app$ nodejs server.js 
 app listening on port 3000!


但是当我打开浏览器到localhost:3000时,我得到:

(node:2716) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring    pass option { useUnifiedTopology: true } to the MongoClient constructor.
/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/topologies/server.js:240
        throw err;
        ^

MongoNetworkError: failed to connect to server [mongodb:27017] on first connect [MongoNetworkError: getaddrinfo EAI_AGAIN mongodb mongodb:27017]
at Pool.<anonymous> (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/topologies/server.js:431:11)
at Pool.emit (events.js:198:13)
at createConnection (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/pool.js:559:14)
at connect (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/pool.js:973:11)
at makeConnection (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/connect.js:39:11)
at callback (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/connect.js:261:5)
at Socket.err (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/connect.js:286:7)
at Object.onceWrapper (events.js:286:20)
at Socket.emit (events.js:198:13)
at emitErrorNT (internal/streams/destroy.js:91:8)


我做错了什么?
编辑;需要说明的是,我在本地计算机上运行node项目(从我的ubuntu主目录),我试图连接到docker mongo容器作为后端。作者可能跳过了她想要如何运行gitlab项目。(或者我误解了),但我假设她想在主机上运行它。她可能计划在容器中运行它,但由于它是在gitlab而不是docker上,我不知道如何将node项目放入容器中。

u91tlkcl

u91tlkcl1#

我刚刚看了一下你在Gitlab中的项目。你的代码中的连接字符串是为mongodb主机名mongodb设置的,当你在docker中运行node进程和mongodb时,它应该可以正常工作。在你的问题中,你似乎是从你的主机执行node。这不允许解析docker内部主机名。要检查这个,* 暂时 * 使用localhost而不是mongodb作为主机名(使用此连接字符串mongodb://admin:password@localhost)。这将使用您的主机作为连接的目标,因为您还Map了docker-compose文件中的端口,该文件打开了主机上的端口。
为了使代码在这两种情况下都能工作,(在host和all-in-docker上为prod开发),你不能在代码中硬编码连接字符串,而是需要使其可配置。一种方法是使用环境变量。有关概念细节,请参阅the 12factor topic on configuration。当涉及到凭据时,这一点尤其重要,凭据根本不应该出现在git存储库中。所以,一个常见的做法是从环境中读取这样的配置。对于node,这就像阅读process.env.YOUR_VAR_FOR_MONGO_HOSTNAME一样简单。有关详细信息,请查看node文档。然后需要将此变量export ed或传递给node的调用。这里提供一些便利的一个工具是dotenv包,它基本上允许指定在你的all-in-docker设置中,你可以相应地将环境变量指定回mongodb而不是localhost

lxkprmvk

lxkprmvk2#

/etc/mongod.conf中的净bindIp值是多少?
(我不知道你的配置在哪里,但你可以试试vim /etc/mongod.conf
如果net bindIp是127.0.0.1,则只能在localhost中连接到mongodb。
当你设置0.0.0.0如下时,你可以在任何地方连接到mongodb。

# only localhost can connect 
net:
  port: 27017
  bindIp: 127.0.0.1

# everyone can connect 
net:
  port: 27017
  bindIp: 0.0.0.0

字符串
顺便说一下,你需要在更改配置后重新启动mongodb。

9cbw7uwe

9cbw7uwe3#

我认为你需要检查Mongo URL "mongodb://admin:password@mongodb"请参考下面的示例,其中有一个连接MongoDB的示例

https://www.w3schools.com/nodejs/nodejs_mongodb_find.asp

字符串
试着这样

const mongoose = require('mongoose');
 let op = {
  poolSize: 10, 
  bufferMaxEntries: 0, 
  reconnectTries: 5000, 
  useNewUrlParser: true, 
  useCreateIndex: true, 
  useUnifiedTopology: true 
 }
    let db = await mongoose.connect(dbUrl + dbName, op)

bvjxkvbb

bvjxkvbb4#

连接到MongoDB Cloud

确保您的MongoDB URL具有以下参数。
第一个月
在2023年的时候,我也是这样。作为一个指导,去MongoDB的连接设置(从https://cloud.mongodb.com/),选择一个驱动程序(在我的例子中是Node.js),然后检查Mongo提供的连接字符串。这可能会给予你一个提示,告诉你你错过了什么。

相关问题