我正在尝试将我拥有的使用node
实例的mongodb
应用程序码头化。我试图将其指向'mongodb://mongo:27018/eugenie_cp'
,但它一直指向127.0.0.1:27017
我遵循了这两个可能被标记为重复的问题,但是我已经使用了那里的答案:
Cannot connect to MongoDB via node.js in Docker
MongoDB on with Docker "failed to connect to server [localhost:27017] on first connect "
由于以下几行而出现错误,但我无法解决。
// call express middleware
var express = require('express');
//Initialize the app.
var app = express();
//setting the mongoose options.
var options = {
useMongoClient: true,
server: {
socketOptions: {
socketTimeoutMS: 0,
connectTimeout: 0
}
},
server: {
reconnectTries: 1000
},
replset: {
socketOptions: {
socketTimeoutMS: 0,
connectTimeout: 0
}
}
};
// Mongo instance here.
var mongoose = require('mongoose');
// setting the MongoDb connection URL / string
var mongodb_connection_url = 'mongodb://mongo:27017/eugenie_cp';
// connect to our database
mongoose.connect(mongodb_connection_url, options);
// MongoDb connection error check
var db_check = mongoose.connection;
db_check.on('error', console.error.bind(console, 'MongoDB connection error:'));
我收到以下错误:
app | MongoDB connection error: Error [MongoError]: failed to connect to server [127.0.0.1:27017] on first connect [Error: connect ECONNREFUSED 127.0.0.1:27017
app | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1126:14) {
app | name: 'MongoError',
app | message: 'connect ECONNREFUSED 127.0.0.1:27017'
app | }]
我的docker-compose.yml
:
version: "3"
services:
app:
depends_on:
- mongo
container_name: app
restart: always
build: .
ports:
- "3002:3002"
links:
- mongo
mongo:
container_name: mongo
image: mongo:3.2
volumes:
- ./data:/data/db
ports:
- "27018:27017"
如何解决此错误?
答案 0 :(得分:3)
在Docker链接或docker-compose网络中,您不应使用发布端口,在服务之间的通信中,您必须使用暴露端口或其他字容器端口,而不是主机端口。
因此更新连接字符串。
var mongoose = require('mongoose');
var mongodb_connection_url = 'mongodb://mongo:27017/eugenie_cp';
mongoose.connect(mongodb_connection_url, options);
主要问题是由于代码被缓存。我们使用一个简单的.js
程序进行了测试,以测试连接,该程序最终指向正确的位置,并为我们提供了未刷新代码的想法。
我猜想,缓存失效是计算机的主要问题之一。
首先启动mongo
$ docker-compose up --build -d mongo
$ docker-compose up --build -d app
它奏效了。