Node.js Docker:尝试使用Docker访问mongoDB时未处理的承诺拒绝
因此,我尝试在远程linux服务器(digital ocean droplet)上使用docker部署非常基本的Node.js应用程序。我对部署相关的东西还很陌生,所以我肯定犯了一些基本的错误。请忍受我的长时间工作 我使用的project和docker docker compose配置文件的代码是: .envNode.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
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 builddocker 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。这里有一个很好的博客供参考