【问题标题】:MongoDB on with Docker "failed to connect to server [localhost:27017] on first connect "MongoDB 与 Docker “首次连接时无法连接到服务器 [localhost:27017]”
【发布时间】:2021-12-30 22:14:36
【问题描述】:

我正在使用带有 NodeJS 后端的 mongoDB。问题是我收到以下错误

node:16) UnhandledPromiseRejectionWarning: MongoNetworkError: failed 在第一次连接时连接到服务器 [localhost:27017] [MongoNetworkError: 连接 ECONNREFUSED 127.0.0.1:27017]

这是我的 docker-compose

version: '3.4'

services:
  db:
    image: mongo:latest
    ports:
      - '27017:27017'

  rest-api-node:
    build: .
    ports:
      - '5000:5000'
    links:
      - db
    restart: on-failure

我也尝试过 depends_on ,但不起作用。

在后端,我是作为与 DB 通信的中间件的猫鼬。这是我index.js的一部分

mongoose.Promise = global.Promise
mongoose.connect('mongodb://localhost/demo')
app.listen(port, () => console.log("live"))

我也尝试过使用 promise ,但没​​有任何变化。请帮帮我。 在此先感谢

完整的错误日志

在游泳池。 (/app/node_modules/mongodb-core/lib/topologies/server.js:505:11) 休息-api-node_1 |在 Pool.emit (events.js:180:13) rest-api-node_1 |在连接处。 (/app/node_modules/mongodb-core/lib/connection/pool.js:329:12) 休息-api-node_1 |在 Object.onceWrapper (events.js:272:13) 休息-api-node_1 |在 Connection.emit (events.js:180:13) 休息-api-node_1 |在套接字。 (/app/node_modules/mongodb-core/lib/connection/connection.js:245:50) 休息-api-node_1 |在 Object.onceWrapper (events.js:272:13) 休息-api-node_1 |在 Socket.emit (events.js:180:13) 休息-api-node_1 |在 emitErrorNT (内部/流/destroy.js:64:8)rest-api-node_1 |在 process._tickCallback (internal/process/next_tick.js:178:19) 休息-api-node_1 |名称:'MongoNetworkError',rest-api-node_1 |
消息:'第一次连接到服务器 [localhost:27017] 失败 连接 [MongoNetworkError: 连接 ECONNREFUSED 127.0.0.1:27017]' }

【问题讨论】:

    标签: node.js mongodb docker docker-compose


    【解决方案1】:

    我有同样的问题,其他解决方案不适合我,但我是这样做的

    注意:

    对于 mongo URI,您必须使用 MongoDB service name 而不是 127.0.0.1localhost

    例如,在下面的 docker-compose 文件中,我的 mongo 服务名称是 mongodb-myapp,我将 URI 更改为 mongodb://mongodb-myapp:27017/myapp,它适用于我

    
    services:
      boilerplate-api-app:
        build: .
        environment:
          - MONGO_URI=mongodb://mongodb-myapp:27017/myapp
        volumes:
          - .:/app
        ports:
          - "5000:5000"
        depends_on:
          - mongodb-myapp
    
     mongodb-myapp:
        image: mongo
        ports:
          - "27017:27017"
    

    【讨论】:

      【解决方案2】:

      我也被困了好几个小时!在连接字符串中设置db:27017 并在rest-api-node 上设置restart: always 确保您连接到正确的IP,并确保节点服务器继续尝试连接到您的数据库。这对我有用!

      【讨论】:

        【解决方案3】:

        默认情况下,Compose 会为您的应用设置单一网络。每个 服务容器加入默认网络,并且两者都是 该网络上的其他容器可以访问,并且可以被该网络上的其他容器发现 它们位于与容器名称相同的主机名。

        根据您的docker-compose.yaml 文件,您只能从主机访问127.0.0.1:27017 上的mongo 容器。 为了从 NodeJS 后端容器访问它,您应该使用 db:27017

        【讨论】:

        • db:27017 是什么意思?
        • 我相信这是 mongo 网址。我面临着同样的问题。容器内没有localhost。您必须将网址更改为mongodb://db:27017/demo。这解决了我的问题。
        • ERROR: The Compose file './docker-compose.yml' is invalid because: services.mongo.ports is invalid: Invalid port "db:27017", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol] -- 上述建议会导致此错误。我还尝试了我正在使用的数据库的名称。
        • @ChumiestBucket 我不明白你为什么对答案投了-1?您不需要在 docker-compose.yml 之上进行更改。当你改变它时,你得到了错误。我的帖子是关于应用程序设置的,我们在其中定义了 mongodb 容器的 url。它应该是 'db:27017' 而不是 'localhost:27017'。
        • 如果您的 docker-compose 有用户名和密码,这将如何工作?
        猜你喜欢
        • 1970-01-01
        • 2020-02-14
        • 2017-05-27
        • 1970-01-01
        • 2021-02-16
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多