gpt4 book ai didi

node.js - 在连接到 Node.js 应用程序的 Docker 容器中使用 MongoDB 的副本集

转载 作者:可可西里 更新时间:2023-11-01 10:38:24 26 4
gpt4 key购买 nike

所以,是的..

我有这些运行 mongod 的容器,它们中的所有 3 个都使用 docker-compose 配置,如下所示:

    version: '3.5'
services:
mongodb-primary:
container_name: mongodb-primary
depends_on:
- mongodb-secondary
- mongodb-arbiter
image: mongo
ports:
- "30001:27017"
networks:
- mongo-cluster
command: "mongod --replSet mongo-rs"

另一个和仲裁器也一样,然后我得到了这个 setup.sh

     mongo-setup:
container_name: mongo-setup
image: mongo
depends_on:
- mongodb-primary
- mongodb-secondary
- mongodb-arbiter
volumes:
- ./scripts/mongosetup.sh:/scripts/mongosetup.sh
networks:
- mongo-cluster
command: "bash /scripts/mongosetup.sh"

然后当然是网络配置。

现在,使用:docker exec -it mongodb-secondary mongo -eval "rs.status()"

我明白了:

    MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
{
"set" : "mongo-rs",
"date" : ISODate("2018-08-24T17:28:25.422Z"),
"myState" : 2,
"term" : NumberLong(12),
"syncingTo" : "mongodb-primary:27017",
"syncSourceHost" : "mongodb-primary:27017",
"syncSourceId" : 0,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1535131703,
1),
"t" : NumberLong(12)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1535131703,
1),
"t" : NumberLong(12)
},
"appliedOpTime" : {
"ts" : Timestamp(1535131703,
1),
"t" : NumberLong(12)
},
"durableOpTime" : {
"ts" : Timestamp(1535131703,
1),
"t" : NumberLong(12)
}
},
"lastStableCheckpointTimestamp" :
Timestamp(1535131683, 1),
"members" : [
{
"_id" : 0,
"name" : "mongodb-
primary:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2050,
"optime" : {
"ts" :
Timestamp(1535131703, 1),
"t" : NumberLong(12)
},
"optimeDurable" : {
"ts" :
Timestamp(1535131703, 1),
"t" : NumberLong(12)
},
"optimeDate" : ISODate("2018-
08-24T17:28:23Z"),
"optimeDurableDate" :
ISODate("2018-08-24T17:28:23Z"),
"lastHeartbeat" :
ISODate("2018-08-24T17:28:25.095Z"),
"lastHeartbeatRecv" :
ISODate("2018-08-24T17:28:24.433Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" :
Timestamp(1535129672, 1),
"electionDate" :
ISODate("2018-08-24T16:54:32Z"),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "mongodb-
secondary:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2055,
"optime" : {
"ts" :
Timestamp(1535131703, 1),
"t" : NumberLong(12)
},
"optimeDate" : ISODate("2018-
08-24T17:28:23Z"),
"syncingTo" : "mongodb-
primary:27017",
"syncSourceHost" : "mongodb-
primary:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "mongodb-
arbiter:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 2052,
"lastHeartbeat" :
ISODate("2018-08-24T17:28:25.095Z"),
"lastHeartbeatRecv" :
ISODate("2018-08-24T17:28:24.158Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1535131703, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1535131703, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}

所以,在我的 Node.js 应用程序上,我尝试连接到这个副本集,这样做:

    const express = require('express');
const { MongoClient } = require('mongodb');
const debug = require('debug')
('app:adminRoutes');
const books = [{'a bunch of stuff'}]
const adminRouter = express.Router();

function router(nav) {
adminRouter.route('/')
.get((req, res) => {
const url = 'mongodb://'
+ 'localhost:30001,'
+ 'localhost:30002,'
+ '/libraryApp?replicaSet=mongo-rs&readPreference=secondaryPreferred';
const dbName = 'libraryApp';
(async function mongo() {
let client;
try {
client = await MongoClient.connect(url);
debug('Connected to the server');
const db = client.db(dbName);
const response = await
db.collection('books').insertMany(books);
res.json(response);
debug(nav);
} catch (err) {
debug(err.stack);
}
client.close();
}());
});
return adminRouter;
}
module.exports = router;

这就是我最终遇到的问题。我不确定连接字符串是错误还是什么,因为整个互联网都是以相同的方式完成的。可能是异步函数在做这个吗?

这是输出:

    [nodemon] starting `node app.js`
app listening on port 4000 +0ms
app:bookRoutes Trying to connect to MongoDB using MongoClient. +0ms



../node_modules/mongodb/lib/topologies/replset.js:368
throw err;
^

最佳答案

使用主机名而不是 0.0.0.0,没有端口,即 mongodb://mongodb-primary,mongodb-secondary/?replicaset=mongo-rsdocker-compose 将完成所有网络工作。

关于node.js - 在连接到 Node.js 应用程序的 Docker 容器中使用 MongoDB 的副本集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com