连接到docker mongo容器时出现问题



我正在尝试连接mongo容器,但在node-js应用程序中,我在启动服务器时遇到错误。

node server.js
app listening on port 3000!
/home/aniket/node_applications/app/node_modules/mongodb/lib/utils.js:698
throw error;
^
MongoServerSelectionError: getaddrinfo ENOTFOUND mongodb
at Timeout._onTimeout (/home/aniket/node_applications/app/node_modules/mongodb/lib/core/sdam/topology.js:438:30)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7) {
reason: TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map {
'mongodb:27017' => ServerDescription {
address: 'mongodb:27017',
error: Error: getaddrinfo ENOTFOUND mongodb
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) {
name: 'MongoNetworkError'
},
roundTripTime: -1,
lastUpdateTime: 2835489,
lastWriteDate: null,
opTime: null,
type: 'Unknown',
topologyVersion: undefined,
minWireVersion: 0,
maxWireVersion: 0,
hosts: [],
passives: [],
arbiters: [],
tags: []
}
},
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
}
}

server.js

let express = require('express');
let path = require('path');
let fs = require('fs');
let MongoClient = require('mongodb').MongoClient;
let bodyParser = require('body-parser');
let app = express();
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, "index.html"));
});
app.get('/profile-picture', function (req, res) {
let img = fs.readFileSync(path.join(__dirname, "images/profile-1.jpg"));
res.writeHead(200, {'Content-Type': 'image/jpg' });
res.end(img, 'binary');
});

// use when starting application as docker container
let mongoUrlDocker = "mongodb://admin:password@mongodb:27017";
// pass these options to mongo client connect request to avoid DeprecationWarning for current Server Discovery and Monitoring engine
let mongoClientOptions = { useNewUrlParser: true, useUnifiedTopology: true };
// "user-account" in demo with docker. "my-db" in demo with docker-compose
let databaseName = "my-db";
app.post('/update-profile', function (req, res) {
let userObj = req.body;
MongoClient.connect(mongoUrlDocker, mongoClientOptions, function (err, client) {
if (err) throw err;
let db = client.db(databaseName);
userObj['userid'] = 1;
let myquery = { userid: 1 };
let newvalues = { $set: userObj };
db.collection("users").updateOne(myquery, newvalues, {upsert: true}, function(err, res) {
if (err) throw err;
client.close();
});
});
// Send response
res.send(userObj);
});
app.get('/get-profile', function (req, res) {
let response = {};
// Connect to the db
MongoClient.connect(mongoUrlDocker, mongoClientOptions, function (err, client) {
if (err) throw err;
let db = client.db(databaseName);
let myquery = { userid: 1 };
db.collection("users").findOne(myquery, function (err, result) {
if (err) throw err;
response = result;
client.close();
// Send response
res.send(response ? response : {});
});
});
});
app.listen(3000, function () {
console.log("app listening on port 3000!");
});

docker compose.yml

version: '3'
services:
mongodb:
image: mongo
ports:
- 27017:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=password
mongo-express:
image: mongo-express
ports:
- 8081:8081
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=admin
- ME_CONFIG_MONGODB_ADMINPASSWORD=password
- ME_CONFIG_MONGODB_SERVER=mongodb
restart: unless-stopped

我尝试了以下所有的东西,但错误是相同的

让mongoUrlDocker=";mongodb://admin:password@mongodb:27017";;

让mongoUrlDocker=";mongodb://admin:password@mongodb";;

让mongoUrlDocker=";mongodb://admin:password@mongodb://mongo:27017";

我假设您的应用程序不在docker上,并且monogodb主机名可以由同样安装在同一docker守护进程上的任何docker容器解析。

否则,您必须使用docker守护进程的主机名和主机上暴露/绑定的端口。

另一种方法是在docker-compose.yml中添加nodejs容器,并将源代码目录装载到node.js容器中,然后在nodejs集装箱中运行应用程序。

参考:https://medium.com/zenofai/how-to-build-a-node-js-and-mongodb-application-with-docker-containers-15e535baabf5

FROM alpine:latest
RUN apk add --no-cache nodejs npm
WORKDIR /app
COPY . /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 8080
CMD [“node”, “app.js”]

我遇到了同样的问题,并通过在连接mongodb时将凭据作为选项传递来解决。更改:

let mongoClientOptions = { useNewUrlParser: true, useUnifiedTopology: true };

为此:

let mongoClientOptions = { authSource: "admin", user: "admin", pass: "password", useNewUrlParser: true, useUnifiedTopology: true };

之后,您可以使用URI,而无需添加它应该工作的凭据,在您的情况下是这样的:

let mongoUrlDocker = "mongodb://mongodb:27017"; 

如果对你有效的话,请告诉我。。

最新更新