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

时间:2020-11-03 23:55:58

标签: node.js mongodb docker

enter image description here

我正在上一个初学者docker课程(https://www.youtube.com/watch?v=3c-iBn73dDE&t=4384s),我认为它做得很好。

作为课程的一部分,将应用与节点服务器和js前端放在一起,并与docker容器进行mongo db通信和mongo express进行持久化。

可以在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;

我有2个docker容器在chromebook上的ubuntu 20.04上运行(截图)。当我跑步时:

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)

我在做什么错了?

编辑;为了清楚起见,我正在本地计算机上(从ubuntu主目录运行)运行节点项目,并且尝试连接到docker mongo容器作为后端。作者可能已经跳过了她想如何运行gitlab项目(否则我会误解了),但是我认为她想在主机上运行它。她可能已经计划在容器中运行它,但是由于它是在gitlab而不是docker上运行的,所以我不知道如何将节点项目放入容器中..

3 个答案:

答案 0 :(得分:5)

我刚刚查看了您在Gitlab中的项目。代码中的连接字符串设置为mongodb主机名mongodb,当您在docker内部运行节点进程和mongodb时,该字符串都可以正常工作。在您的问题中,您似乎正在从主机执行节点。这不允许解析docker内部主机名。要进行检查,请暂时使用localhost代替mongodb作为主机名(使用此连接字符串mongodb://admin:password@localhost)。这将使用您的主机作为连接目标,因为您也mapped the ports in your docker-compose file打开了主机上的端口。

要使代码在两种情况下都能工作(在主机上进行开发,并在prod中使用docker进行开发),您不能在代码内部对连接字符串进行硬编码,而需要对其进行配置。一种方法是使用环境变量。有关概念性详细信息,请参见the 12factor topic on configuration。当涉及到凭证时,这一点尤其重要,凭证永远不会最终出现在git存储库中。因此,一种常见的做法是从环境中读取此类配置。使用节点,这就像读取process.env.YOUR_VAR_FOR_MONGO_HOSTNAME一样简单。检查the node docs了解更多信息。然后,需要export将此变量或传递给node的调用。其中一种提供便利的工具是用于打包的dotenv软件包,它基本上允许在文本文件中指定env以用于开发目的。然后,在docker-in-docker安装程序中,可以相应地将环境变量指定回mongodb而不是localhost

答案 1 :(得分:2)

/etc/mongod.conf中的bindIp净值是多少?
(我不确定您的配置在哪里,但是您可以尝试vim /etc/mongod.conf

如果net bindIp为127.0.0.1,则只能连接到本地主机中的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。

答案 2 :(得分:0)

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

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