我将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]'}
答案 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.1
或 localhost
例如,在下面的 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.1
或mongoose.connect
更改为docker-compose服务名称。
答案 3 :(得分:0)
我也被困了几个小时!在连接字符串中设置db:27017
,在restart: always
上设置rest-api-node
可以确保您连接到正确的IP,并确保节点服务器继续尝试连接到数据库。这对我有用!