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

import mongoose from "mongoose"; const MongoDBService = async () => { try { const connectionString = "mongodb://root:password123@localhost:27017/streamhatchet?authSource=admin&replicaSet=replicaset&retryWrites=true" const options = { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false, autoIndex: true, poolSize: 10, serverSelectionTimeoutMS: 30000, socketTimeoutMS: 75000, family: 4, keepAlive: true, keepAliveInitialDelay: 300000, }; await mongoose.connect(connectionString, options); } catch (error) { console.log(error); } mongoose.connection.on("error", (err) => { console.log(error); }); }; export default MongoDBService;

docker-compose.yml;

version: '2' services: mongodb-primary: image: 'docker.io/bitnami/mongodb:4.4-debian-10' ports: - 27017:27017 environment: - MONGODB_ADVERTISED_HOSTNAME=mongodb-primary - MONGODB_REPLICA_SET_MODE=primary - MONGODB_ROOT_PASSWORD=password123 - MONGODB_REPLICA_SET_KEY=replicasetkey123 volumes: - 'mongodb_master_data:/bitnami/mongodb' mongodb-arbiter: image: 'docker.io/bitnami/mongodb:4.4-debian-10' depends_on: - mongodb-primary environment: - MONGODB_ADVERTISED_HOSTNAME=mongodb-arbiter - MONGODB_REPLICA_SET_MODE=arbiter - MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 - MONGODB_REPLICA_SET_KEY=replicasetkey123 volumes: mongodb_master_data: driver: local

mongo --host localhost --port 27017 --username root --password password123 admin

rs.status()

replicaset:PRIMARY> rs.status() { "set" : "replicaset", "date" : ISODate("2020-11-19T09:36:25.442Z"), "myState" : 1, "term" : NumberLong(2), "syncSourceHost" : "", "syncSourceId" : -1, "heartbeatIntervalMillis" : NumberLong(2000), "majorityVoteCount" : 2, "writeMajorityCount" : 1, "votingMembersCount" : 2, "writableVotingMembersCount" : 1, "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1605778584, 1), "t" : NumberLong(2) }, "lastCommittedWallTime" : ISODate("2020-11-19T09:36:24.429Z"), "readConcernMajorityOpTime" : { "ts" : Timestamp(1605778584, 1), "t" : NumberLong(2) }, "readConcernMajorityWallTime" : ISODate("2020-11-19T09:36:24.429Z"), "appliedOpTime" : { "ts" : Timestamp(1605778584, 1), "t" : NumberLong(2) }, "durableOpTime" : { "ts" : Timestamp(1605778584, 1), "t" : NumberLong(2) }, "lastAppliedWallTime" : ISODate("2020-11-19T09:36:24.429Z"), "lastDurableWallTime" : ISODate("2020-11-19T09:36:24.429Z") }, "lastStableRecoveryTimestamp" : Timestamp(1605778554, 1), "electionCandidateMetrics" : { "lastElectionReason" : "electionTimeout", "lastElectionDate" : ISODate("2020-11-19T09:17:54.388Z"), "electionTerm" : NumberLong(2), "lastCommittedOpTimeAtElection" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "lastSeenOpTimeAtElection" : { "ts" : Timestamp(1605777471, 8), "t" : NumberLong(1) }, "numVotesNeeded" : 1, "priorityAtElection" : 5, "electionTimeoutMillis" : NumberLong(10000), "newTermStartDate" : ISODate("2020-11-19T09:17:54.390Z"), "wMajorityWriteAvailabilityDate" : ISODate("2020-11-19T09:17:54.480Z") }, "members" : [ { "_id" : 0, "name" : "mongodb-primary:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1112, "optime" : { "ts" : Timestamp(1605778584, 1), "t" : NumberLong(2) }, "optimeDate" : ISODate("2020-11-19T09:36:24Z"), "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1605777474, 1), "electionDate" : ISODate("2020-11-19T09:17:54Z"), "configVersion" : 61323, "configTerm" : -1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "mongodb-arbiter:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 1108, "lastHeartbeat" : ISODate("2020-11-19T09:36:24.649Z"), "lastHeartbeatRecv" : ISODate("2020-11-19T09:36:24.666Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : 61323, "configTerm" : -1 } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1605778584, 1), "signature" : { "hash" : BinData(0,"WD1gDogfO+q0uWoLOy2tvycsDx8="), "keyId" : NumberLong("6896761722598588420") } }, "operationTime" : Timestamp(1605778584, 1) }

将此参数添加到您的连接字符串:
directConnection=true

就像以下:

mongodb://root:password123@localhost:27017/streamhatchet?directConnection=true&authSource=admin&replicaSet=replicaset&retryWrites=true

node.js mongodb mongoose
1个回答
19
投票

https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-options

Https://www.mongodb.com/docs/mongodb-shell/connect/#connect-to-a-replica-set


https://pkg.go.dev/go.mongodb.org/

[电子邮件保护]

/mongo/options#clientoptions.setDirect

为什么添加“ directConnection = true”解决了问题? DirectConnection = true Flag迫使MongoDB客户端(在您的情况下)直接连接到指定的主机,而不是尝试发现副本集。 默认情况下,当您连接到MongoDB时,驱动程序会尝试自动发现复制品集。如果您有一个群集(多个mongoDB实例),这很有用,但是在您的情况下,您正在本地运行一个实例。

通过添加DirectConnection = true,您正在告诉猫鼬:

Skip副本集发现过程。直接连接到 指定的mongodb节点


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