这是我的节点应用程序的一部分
app.configure('development', function() {
app.set('db-uri', 'mongodb://localhost/nodepad-development');
app.use(express.errorHandler({ dumpExceptions: true }));
app.set('view options', {
pretty: true
});
});
app.configure('test', function() {
app.set('db-uri', 'mongodb://localhost/nodepad-test');
app.set('view options', {
pretty: true
});
});
app.configure('production', function() {
app.set('db-uri', 'mongodb://localhost/nodepad-production');
});
编辑为
app.set('db-uri', 'mongodb://mongoDB:27017/nodepad-development');
仍然是相同的错误。我已经为在本地主机上运行的节点应用程序创建了容器,但由于无法执行POST请求而无法将其连接到另一个mongo容器。
这是我的docker撰写文件
version: '3'
services:
apptest:
container_name: apptest
restart: always
image: ekamzf/nodeapp:1.1
ports:
- '8080:8080
depends_on:
- mongoDB
mongoDB:
container_name: mongoDB
image: mongo
volumes:
- ./data:/usr/src/app
ports:
- '27017:27017'
并且当我尝试在我的节点应用程序中注册帐户详细信息时收到的错误是
Error: Timeout POST /users
at null._onTimeout (/usr/src/app/node_modules/connect-timeout/index.js:12:22)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
我想念的是什么?基本上,无论如何我应该如何将这种类型的代码与mongodb连接起来?'db-uri'的作用是什么?
Docker Compose将服务名别名为主机名。
因为您将运行mongo
映像的容器命名为mongoDB
,所以mongodb
(不区分大小写)将是主机的名称,并且应从Node.JS容器和应用程序中使用该名称进行引用。
localhost
替换URI中的mongodb
MongoDB数据库默认为端口27017。除非更改了端口,否则应指定此值。
将端口添加到URI,以便您拥有mongodb:27017
可选,但good practice,将应用重构为使用环境变量而不是硬编码的值。
这至少有两个好处:
a。您的代码变得更加灵活;b。通过指定这些值,您的Compose文件将更加清晰。
请参阅DockerHub文档以获取映像here
请参阅有关连接字符串here的MongoDB文档”>
Google搜索使用Compose,MongoDB和Node.JS返回[C0
我相信您的问题可能与Compose容器的投放时间有关。我相信您的应用程序会在数据库容器准备好之前尝试连接到数据库。这是Compose的常见问题,not使用Compose的many examples解决。相反,您必须为此找到一个MongoDB(或其他数据库)解决方案。
在我的副本中,depends_on
(请参见下文)在尝试连接数据库之前引入了错误的延迟。 5秒钟足以准备数据库容器,因此可以正常工作:
depends_on
然后:
index.js
良品
docker-compose build --no-cache docker-compose up
。
或者,为了证明时间问题,您可以单独运行容器(并且可以删除docker-compose logs app
Attaching to 60359441_app_1
app_1 | URL: mongodb://mongodb:27017/example
app_1 | Connected
函数以确保在应用程序之前数据库已准备就绪:
Connected
docker-compose.yaml:
因为我遵循了您对sleep
NB
HOST=localhost # No DNS naming
PORT=37017 # An arbitrary port to prove the point
# In one session
docker run \
--interactive --tty --rm \
--publish=${PORT}:27017 \
mongo
# In another session
docker run \
--interactive --tty --rm \
--net=host \
--env=HOST=${HOST} --env=PORT=${PORT} --env=DATA=example --env=WAIT=0 \
app
URL: mongodb://localhost:37017/example
Connected
的命名,所以必须通过version: "3"
services:
app:
image: app
build:
context: ./app
dockerfile: Dockerfile
environment:
- HOST=mongodb
- PORT=27017
- DATA=example
- WAIT=5000
volumes:
- ${PWD}/app:/app
mongodb:
image: mongo
restart: always
# environment:
# MONGO_INITDB_ROOT_USERNAME: root
# MONGO_INITDB_ROOT_PASSWORD: example
mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_SERVER: mongodb
# ME_CONFIG_MONGODB_ADMINUSERNAME: root
# ME_CONFIG_MONGODB_ADMINPASSWORD: example
]为mongodb
容器提供此主机名>NB用mongo-express
和ME_CONFIG_MONGODB_SERVER
图像显示的其他环境变量是默认值,因此是可选的。
Dockerfile:
mongo
index.js:
mongo-express
NB
FROM node:13.8.0-slim WORKDIR /usr/src/app COPY package.json . RUN npm install COPY . . ENTRYPOINT ["node","index.js"]
使用环境(// Obtain config from the environment const HOST = process.env.HOST; const PORT = process.env.PORT; const DATA = process.env.DATA; const WAIT = parseInt(process.env.WAIT, 10); // Create MongoDB client var MongoClient = require("mongodb").MongoClient; let url = `mongodb://${HOST}:${PORT}/${DATA}`; console.log(`URL: ${url}`); // Artificially delay the code setTimeout(function() { MongoClient.connect(url, function(err, db) { if(!err) { console.log("Connected"); } }); }, WAIT);
,index.js
,HOST
)进行配置,这是一个好习惯。
[包含PORT
提供了浏览DB
服务器以随时观察发生的情况的能力:
mongo-express
HTH!