nodejs通过外网连接mongodb副本集报错ReplicaSetNoPrimary

MongoDB server version: 4.0.27
在腾讯云的一台CVM上搭建mongodb副本集群:

127.0.0.1:27017
127.0.0.1:27018
127.0.0.1:27019

test@VM-40-8-centos 4> rs.config()
{
    "_id" : "dbset",
    "version" : 1,
    "protocolVersion" : NumberLong(1),
    "writeConcernMajorityJournalDefault" : true,
    "members" : [
        {
            "_id" : 1,
            "host" : "127.0.0.1:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "127.0.0.1:27018",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 3,
            "host" : "127.0.0.1:27019",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        }
    ],
    "settings" : {
        "chainingAllowed" : true,
        "heartbeatIntervalMillis" : 2000,
        "heartbeatTimeoutSecs" : 10,
        "electionTimeoutMillis" : 10000,
        "catchUpTimeoutMillis" : -1,
        "catchUpTakeoverDelayMillis" : 30000,
        "getLastErrorModes" : {
            
        },
        "getLastErrorDefaults" : {
            "w" : 1,
            "wtimeout" : 0
        },
        "replicaSetId" : ObjectId("6279e0ed8988a1c0b5d477e4")
    }
}

自己电脑运行nodejs,通过外网连接mongodb集群,报错如下:

MongooseServerSelectionError: connect ETIMEDOUT 127.0.0.1:27017
    at NativeConnection.Connection.openUri (D:\main\node_modules\mongoose\lib\connection.js:807:32)
    at D:\main\node_modules\mongoose\lib\index.js:342:10
    at D:\main\node_modules\mongoose\lib\helpers\promiseOrCallback.js:32:5
    at new Promise (<anonymous>)
    at promiseOrCallback (D:\main\node_modules\mongoose\lib\helpers\promiseOrCallback.js:31:10)
    at Mongoose._promiseOrCallback (D:\main\node_modules\mongoose\lib\index.js:1181:10)
    at Mongoose.connect (D:\main\node_modules\mongoose\lib\index.js:341:20)
    at Object.<anonymous> (D:\main\src\database\mongodb.js:60:10)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) {
  reason: TopologyDescription {
    type: 'ReplicaSetNoPrimary',
    servers: Map(3) {
      '127.0.0.1:27017' => [ServerDescription],
      '127.0.0.1:27018' => [ServerDescription],
      '127.0.0.1:27019' => [ServerDescription]
    },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: 'dbset',
    maxSetVersion: 1,
    maxElectionId: new ObjectId("7fffffff0000000000000002"),
    commonWireVersion: 7,
    logicalSessionTimeoutMinutes: undefined
  },
  code: undefined
}

但通过命令行却是可以连接
mongo mongodb://develop:xxxx@公网IP:27017/test?authSource=admin

处理思路:
大概是mongodb副本集群配置的members.host配置127.0.0.1导致的,如果改成对应的公网IP就可以,但这样副本之间的通信就走公网了,不可取。
或者说nodejs有什么特殊的连接配置?

阅读 2.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题