使用Docker的MongoDB在“第一次连接时无法连接到服务器[localhost:27017]”

时间:2018-06-24 15:53:54

标签: node.js mongodb docker docker-compose

我将MongoDB与NodeJS后端一起使用。问题是我遇到以下错误

  

节点:16)UnhandledPromiseRejectionWarning:MongoNetworkError:失败   在第一次连接时连接到服务器[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)   rest-api-node_1 |在Pool.emit(events.js:180:13)rest-api-node_1   |在连接。   (/app/node_modules/mongodb-core/lib/connection/pool.js:329:12)   rest-api-node_1 |在Object.onceWrapper(events.js:272:13)   rest-api-node_1 |在Connection.emit(events.js:180:13)   rest-api-node_1 |在套接字。   (/app/node_modules/mongodb-core/lib/connection/connection.js:245:50)   rest-api-node_1 |在Object.onceWrapper(events.js:272:13)   rest-api-node_1 |在Socket.emit(events.js:180:13)   rest-api-node_1 |在emitErrorNT   (internal / streams / destroy.js:64:8)rest-api-node_1 |在   process._tickCallback(内部/进程/next_tick.js:178:19)   rest-api-node_1 |名称:“ MongoNetworkError”,rest-api-node_1 |
  消息:“首先无法连接到服务器[localhost:27017]   connect [MongoNetworkError:connect ECONNREFUSED 127.0.0.1:27017]'}

4 个答案:

答案 0 :(得分:2)

  

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

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

答案 1 :(得分:2)

我有同样的问题,其他解决方案对我不起作用,但我是这样做的

注意:

对于 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 :(得分:0)

更改此

mongoose.connect('mongodb://localhost:27017/dbName', { useNewUrlParser: true });

对此

mongoose.connect('mongodb://db:27017/dbName', { useNewUrlParser: true }); // docker-compose service name

localhost中的127.0.0.1mongoose.connect更改为docker-compose服务名称。

答案 3 :(得分:0)

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