我如何使用docker-compose使用此mongoDB连接字符串将mongo数据库连接到我的节点应用程序?

问题描述 投票:1回答:1

这是我的节点应用程序的一部分

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'的作用是什么?

node.js mongodb docker docker-compose database-connection
1个回答
2
投票

Docker Compose将服务名别名为主机名。

因为您将运行mongo映像的容器命名为mongoDB,所以mongodb(不区分大小写)将是主机的名称,并且应从Node.JS容器和应用程序中使用该名称进行引用。

  1. localhost替换URI中的mongodb

MongoDB数据库默认为端口27017。除非更改了端口,否则应指定此值。

  1. 将端口添加到URI,以便您拥有mongodb:27017

  2. 可选,但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容器提供此主机名>

NBmongo-expressME_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.jsHOST)进行配置,这是一个好习惯。

[包含PORT提供了浏览DB服务器以随时观察发生的情况的能力:

mongo-express

HTH!

© www.soinside.com 2019 - 2024. All rights reserved.