-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Major - P3
-
Affects Version/s: 3.6.3
-
Component/s: None
-
None
-
Needed
-
None
-
None
-
None
-
None
-
None
-
None
db.isMaster() result:
{
"hosts" : [
"127.0.0.1:27017"
],
"setName" : "rs0",
"setVersion" : 4,
"ismaster" : true,
"secondary" : false,
"primary" : "127.0.0.1:27017",
"me" : "127.0.0.1:27017",
"electionId" : ObjectId("7fffffff0000000000000002"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1608045184, 1),
"t" : NumberLong(2)
},
"lastWriteDate" : ISODate("2020-12-15T15:13:04.000Z"),
"majorityOpTime" : {
"ts" : Timestamp(1608045184, 1),
"t" : NumberLong(2)
},
"majorityWriteDate" : ISODate("2020-12-15T15:13:04.000Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2020-12-15T15:13:09.754Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 20,
"minWireVersion" : 0,
"maxWireVersion" : 8,
"readOnly" : false,
"ok" : 1.0,
"$clusterTime" : {
"clusterTime" : Timestamp(1608045184, 1),
"signature" : {
"hash" : { "$binary" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", "$type" : "00" },
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1608045184, 1)
}
To reproduce:
1. Set up a MongoDB instance listening to all IPs and running as a replica set:
mongod --bind_ip_all --replSet rs0
2. Configure the replica set with a single member whose host attribute is 'localhost';
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: '127.0.0.1:27017' }
]
});
or
rs.reconfig({
_id: 'rs0',
protocolVersion: 1,
members: [
{ _id: 0, host: '127.0.0.1:27017' }
]
});
3. On a SEPARATE machine which IS NOT running a MongoDB instance, execute the following Node.js script:
const { MongoClient } = require('mongodb'); const test = async () => { try { const client = await MongoClient.connect('mongodb://<my-mongodb>', { useNewUrlParser: true, useUnifiedTopology: true }); await client.close(); console.log('Done.'); } catch (err) { console.log(err); } }; test();
where <my-mongodb> is the IP address or host name of the server you set up earlier.
The connection attempt fails with the following error:
MongoServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
at Timeout._onTimeout (/home/ivan/Code/mongodb-test/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: 'ReplicaSetNoPrimary',
setName: 'rs0',
maxSetVersion: 2,
maxElectionId: 7fffffff0000000000000002,
servers: Map(1) { '127.0.0.1:27017' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: 8
}
}
NOTE: if 'useUnifiedTopology' is set to false, the connection attempt succeeds.
Workaround: change the replica set configuration so the member resolves to the server's IP:
rs.reconfig({
_id: 'rs0',
protocolVersion: 1,
members: [
{ _id: 0, host: '<my-mongodb>:27017' }
]
});