Node.js Docker:尝试使用Docker访问mongoDB时未处理的承诺拒绝

Node.js Docker:尝试使用Docker访问mongoDB时未处理的承诺拒绝,node.js,mongodb,docker,docker-compose,Node.js,Mongodb,Docker,Docker Compose,因此,我尝试在远程linux服务器(digital ocean droplet)上使用docker部署非常基本的Node.js应用程序。我对部署相关的东西还很陌生,所以我肯定犯了一些基本的错误。请忍受我的长时间工作 我使用的project和docker docker compose配置文件的代码是: .env MONGO_USERNAME=sammy MONGO_PASSWORD=password MONGO_DB=sharkinfo PORT=8080 MONGO_PORT=27017 MON

因此,我尝试在远程linux服务器(digital ocean droplet)上使用docker部署非常基本的Node.js应用程序。我对部署相关的东西还很陌生,所以我肯定犯了一些基本的错误。请忍受我的长时间工作

我使用的project和docker docker compose配置文件的代码是:

.env

MONGO_USERNAME=sammy
MONGO_PASSWORD=password
MONGO_DB=sharkinfo
PORT=8080
MONGO_PORT=27017
MONGO_HOSTNAME=127.0.0.1

FROM node:10

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "node", "src/index.js"]
Dockerfile

MONGO_USERNAME=sammy
MONGO_PASSWORD=password
MONGO_DB=sharkinfo
PORT=8080
MONGO_PORT=27017
MONGO_HOSTNAME=127.0.0.1

FROM node:10

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "node", "src/index.js"]
docker compose.yml

version: '3'

services:
  nodejs:
    build: .
    env_file: .env
    environment:
      - MONGO_USERNAME=$MONGO_USERNAME
      - MONGO_PASSWORD=$MONGO_PASSWORD
      - MONGO_HOSTNAME=myDB
      - MONGO_PORT=$MONGO_PORT
      - MONGO_DB=$MONGO_DB
    ports:
      - "80:8080"
    networks:
      - app-network
  myDB:
    image: mongo:4.1.8-xenial
    env_file: .env
    environment:
      - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
      - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
    volumes:
      - dbdata:/data/db
    networks:
      - app-network
networks:
  app-network:
    driver: bridge

volumes:
  dbdata:
mongoose.js

const mongoose = require('mongoose');

const {
  MONGO_USERNAME,
  MONGO_PASSWORD,
  MONGO_HOSTNAME,
  MONGO_PORT,
  MONGO_DB
} = process.env;

const url = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_DB}?authSource=admin`;

mongoose.connect(url, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false
});
然后我使用命令创建并运行了一个docker映像(按顺序)docker compose build
docker compose up-d
。 节点和mongoDB服务器都显示在正在运行的docker进程列表中。但是,当我执行
docker logs node application
时,我得到一个错误:

Server is up on port 8080
(node:1) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [mydb:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 172.19.0.3:27017]
    at Pool.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:564:11)
    at Pool.emit (events.js:198:13)
    at Connection.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:317:12)
    at Object.onceWrapper (events.js:286:20)
    at Connection.emit (events.js:198:13)
    at Socket.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:246:50)
    at Object.onceWrapper (events.js:286:20)
    at Socket.emit (events.js:198:13)
    at emitErrorNT (internal/streams/destroy.js:91:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
服务器在端口8080上启动
(节点:1)未经处理的PromiserEjectionWarning:MongoNetworkError:在第一次连接时未能连接到服务器[mydb:27017][MongoNetworkError:connect-EconRefuse172.19.0.3:27017]
在游泳池。(/usr/src/app/node_modules/mongodb core/lib/topologies/server.js:564:11)
在Pool.emit(events.js:198:13)
在连接处。(/usr/src/app/node_modules/mongodb core/lib/connection/pool.js:317:12)
在Object.onceWrapper(events.js:286:20)
在Connection.emit(events.js:198:13)
在插座上。(/usr/src/app/node_modules/mongodb core/lib/connection/connection.js:246:50)
在Object.onceWrapper(events.js:286:20)
在Socket.emit(events.js:198:13)
在发射时出错(内部/streams/destroy.js:91:8)
在emitErrorAndCloseNT(内部/streams/destroy.js:59:3)
在进程中。_tick回调(内部/process/next_tick.js:63:19)
(节点:1)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:1)
(节点:1)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。

我尝试过对我的代码进行各种调整,但没有成功,它仍然会给出相同的错误。这里可能有什么问题

您是否已检查您的本地MongoDB实例是否在端口27017上本地运行或在其他端口上运行,并且您可以使用提供的凭据连接到MongoDB?请尝试打印连接url,并查看环境中的所有信息是否准确variables@RajeshDwivedi使用
docker ps
显示mongoDB是在端口
27017
上运行。但是,我不知道如何在远程linux服务器上使用凭据连接到mongoDB。你能解释一下吗?使用docker ps获取现有容器的名称。使用命令docker exec-it/bin/bash在容器中获取bash shell。一旦进入shell,您就可以使用mongoclient连接到mongo。这里有一个很好的博客供参考