![](/img/trans.png)
[英]Error when connecting to MongoDB = MongoError: failed to connect to server [localhost:27017] on first connect
[英]MongoDB on with Docker "failed to connect to server [localhost:27017] on first connect "
我正在使用帶有 NodeJS 后端的 mongoDB。 問題是我收到以下錯誤
node:16) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect 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
,但沒有工作。
在后端,我是貓鼬作為與數據庫通信的中間件。 這是我的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 (internal/process/next_tick.js:178:19) rest-api-node_1 | 名稱:'MongoNetworkError',rest-api-node_1 |
消息:'第一次連接時無法連接到服務器 [localhost:27017] [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]'}
默認情況下, Compose 會為您的應用程序設置一個網絡。 服務的每個容器都加入默認網絡,並且可以被該網絡上的其他容器訪問,並且可以通過與容器名稱相同的主機名被它們發現。
根據您docker-compose.yaml
文件,您只能從主機訪問127.0.0.1:27017
上的 mongo 容器。 為了從 NodeJS 后端容器訪問它,您應該使用db:27017
。
我有同樣的問題,其他解決方案對我不起作用,但我是這樣做的
對於 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"
我也被困了幾個小時! 在連接字符串中設置db:27017
並restart: always
在rest-api-node
上確保您連接到正確的 IP 並確保節點服務器繼續嘗試連接到您的數據庫。 這對我有用!
改變這個
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.yaml
version: "3"
services:
node-app:
build: .
ports:
- "3000:3000"
environment:
- PORT=3000
mongo:
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=imran
- MONGO_INITDB_ROOT_PASSWORD=test_password
volumes:
- mongo-db:/data/db
volumes:
mongo-db:
上面的代碼是 docker-compose.yaml 文件,MongoDB 的服務名稱是 'mongo'。 您不必手動插入容器的 IP 地址。 而不是像下面給出的示例代碼那樣在 MongoDB URI 中插入服務名稱:
const express = require("express");
const mongoose = require("mongoose");
const app = express();
mongoose
.connect("mongodb://imran:test_password@mongo:27017/?authSource=admin")
.then(() => {
console.log("Successfully connected to the DB");
})
.catch((e) => {
console.log(e);
});
const port = process.env.PORT || 3000;
// routes
app.get("/", (req, res) => {
res.send("<h1>Running on Container!</h1>");
});
app.listen(port, () => console.log(`listening on port ${port}`));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.