NodeJS MongoDB ReplicaSetNoPrimary - node.js

I was attempting to connect to a MongoDB cluster using the following from the nodeJS MongoDB package
const client = require('mongodb').MongoClient
const conn = await client.connect(
process.env.MONGO_DSN,
{
useUnifiedTopology: true,
ssl: process.env.MONGO_SSL, // true
},
)
The MONGO_DSN variable is as follows:
mongodb://{USER}:{PASSWORD}#{HOST1}:27017,{HOST2}:27017,{HOST3}:27017/{DB_NAME}?ssl=true&replicaSet={REPLICASET}&authSource=admin&retryWrites=true&w=majority
However, the connection times out with the error
MongoServerSelectionError: connection <monitor> to {IP_ADDRESS}:27017 closed
at Timeout._onTimeout (/node_modules/mongodb/lib/core/sdam/topology.js:438:30)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7) {
name: 'MongoServerSelectionError',
reason: TopologyDescription {
type: 'ReplicaSetNoPrimary',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map {
'{HOST1}:27017' => [ServerDescription],
'{HOST2}:27017' => [ServerDescription],
'{HOST3}:27017' => [ServerDescription]
},
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
}
}
After a little playing around, I found out that I can connect successfully if I remove the ssl config option from the driver constructor and leave it to infer it from the DSN query string:
const client = require('mongodb').MongoClient
const conn = await client.connect(
process.env.MONGO_DSN,
{
useUnifiedTopology: true,
},
)
Why would this config option (not sure if others effect this too) effect the ability to connect?
Is it because if there are config options specified in the constructor that appear in the DSN, then it completely ignores the DSN query string, which would mean some config options would then be missing (primary replica)?
To clarify, there are no issues with the hosts in the DSN, no issues with connecting to the database normally, only when the config is set in the constructor.

Related

Unable to connect aws documentdb from node.js using mongoose

Here is my node.js code i am trying to connect aws document db using mongoose but getting
below error.
const URL = "mongodb://school:SJDJDJDJDD#dev-docdb-2022-09-02-05-55-49.cqsssmioaafcdjkaooj9.ap-south-1.docdb.amazonaws.com:27017/school?ssl=true&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false";
// Connect to MongoDB.
const connect = mongoose.connect(
URL, {
ssl: true,
sslValidate: true,
sslCA: `./rds-combined-ca-bundle.pem`,
useNewUrlParser: true,
useUnifiedTopology: true,
},
{}
);
errors i am getting
ubuntu#ip-172-31-38-108:~/school_api$ npm start
> graphql-crud#1.0.0 start
> node server.js
🚀 Server ready at http://localhost:4000/graphql
MongooseServerSelectionError: unable to get local issuer certificate
at Connection.openUri (/home/ubuntu/school_api/node_modules/mongoose/lib/connection.js:847:32)
at /home/ubuntu/school_api/node_modules/mongoose/lib/index.js:351:10
at /home/ubuntu/school_api/node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5
at new Promise (<anonymous>)
at promiseOrCallback (/home/ubuntu/school_api/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)
at Mongoose._promiseOrCallback (/home/ubuntu/school_api/node_modules/mongoose/lib/index.js:1149:10)
at Mongoose.connect (/home/ubuntu/school_api/node_modules/mongoose/lib/index.js:350:20)
at Object.<anonymous> (/home/ubuntu/school_api/server.js:18:26)
at Module._compile (node:internal/modules/cjs/loader:1119:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1173:10)
at Module.load (node:internal/modules/cjs/loader:997:32)
at Module._load (node:internal/modules/cjs/loader:838:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:18:47 {
reason: TopologyDescription {
type: 'ReplicaSetNoPrimary',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map(1) {
'dev-docdb-2022-09-02-05-55-49.cqioaafcooj9.ap-south-1.docdb.amazonaws.com:27017' => [ServerDescription]
},
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
}
}
I have my cerificate available also inside my code. please take a look.
I am able to connect to mongodb shell from the server. So there must be something wrong
in the code.
const URL = `mongodb://school:SJDJDJDJDD#dev-docdb-2022-09-02-05-55-49.cqsssmioaafcdjkaooj9.ap-south-1.docdb.amazonaws.com:27017/school?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false`
const addedToUrl = `&tls=true&tlsCAFile=rds-combined-ca-bundle.pem`;
const connect = mongoose.connect(
`${URL}${addedToUrl}`, {
useNewUrlParser: true,
useUnifiedTopology: true,
},
{}
);
You can place these parameters in the connection string.

After migrating from Monggose 5.x to 6.x facing connectivity issues

I am migrating the mongoose from 5.x to 6.x, using createConnection method and updated the options as suggested in mongoose official site.
Trying to connect through the SSL certificate validation and X.509 authentication.
Getting the below error:
Connected SuccessFully 2
API is running securely on the PORT: 3123
Error connecting to Mongo Database.
MongooseServerSelectionError: unable to get local issuer certificate
at NativeConnection.Connection.openUri (/opt/connect/service/node_modules/mongoose/lib/connection.js:824:32)
at Mongoose.createConnection (/opt/connect/service/node_modules/mongoose/lib/index.js:326:10)
at TestSetupConnection.setupConnection (/opt/connect/service/classtestmongoose.js:29:41)
at /opt/connect/service/app.js:30:60
at propagateAslWrapper (/opt/connect/service/node_modules/async-listener/index.js:504:23)
at /opt/connect/service/node_modules/async-listener/index.js:541:70
at /opt/connect/service/node_modules/async-listener/glue.js:188:31
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
reason: TopologyDescription {
type: 'ReplicaSetNoPrimary',
servers: Map(3) {
'pl-1-us-east-1.5ylwo.mongodb.net:1025' => [ServerDescription],
'pl-1-us-east-1.5ylwo.mongodb.net:1026' => [ServerDescription],
'pl-1-us-east-1.5ylwo.mongodb.net:1024' => [ServerDescription]
},
stale: false,
compatible: true,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
setName: 'atlas-24xeac-shard-3',
logicalSessionTimeoutMinutes: undefined
},
code: undefined
}

Connecting mongoose to AWS documentDB

I am trying to connect a NodeJS server to an AWS documentDB cluster with TLS enabled. The NodeJS server is hosted on an EC2 instance and it's on the same VPC as the documentDB cluster. But I'm getting the following error:
{ MongoServerSelectionError: unable to get local issuer certificate
at Timeout.waitQueueMember.timer.setTimeout [as _onTimeout] (/home/ubuntu/server/node_modules/mongodb/lib/core/sdam/topology.js:438:30)
at ontimeout (timers.js:436:11)
at tryOnTimeout (timers.js:300:5)
at listOnTimeout (timers.js:263:5)
at Timer.processTimers (timers.js:223:10)
name: 'MongoServerSelectionError',
reason:
TopologyDescription {
type: 'ReplicaSetNoPrimary',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers:
Map {
'*******.cluster-****.us-east-1.docdb.amazonaws.com:27017' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null } }
The error seems to be with the TLS certificate. But I'm passing the contents of rds-combined-ca-bundle.pem while connecting as shown in the following code:
uri = process.env.MONGODB_URI || process.env.Db_url;
options = {
user: "****",
pass: "****",
}
mongoose.set("useCreateIndex", true);
mongoose.connect(
uri,
{
useNewUrlParser: true,
useFindAndModify: false,
useUnifiedTopology: true,
sslCA: [fs.readFileSync("/home/ubuntu/rds-combined-ca-bundle.pem")],
},
err => {
if (err) {
console.log('Connection Error: ', err);
} else {
console.log(`Successfully Connected============`);
}
}
);
I've tried connecting to the mongo cluster using mongo shell on EC2 instance using
mongo --ssl --host *******.cluster-****.us-east-1.docdb.amazonaws.com:27017 \
--sslCAFile rds-combined-ca-bundle.pem --username ***** --password *****
and this is working. So, the connection to the cluster is fine, but the mongoose cannot connect.
Is there any other way to connect to documentDB using mongoose?
Can you add ssl: true ? Something like this works for me:
const mongoose = require('mongoose');
main().catch(err => console.log(err));
async function main() {
await mongoose.connect('mongodb://user:password#docdb_uri',
{
useNewUrlParser: true,
ssl: true,
sslValidate: true,
sslCA: `/usr/local/rds-combined-ca-bundle.pem`
})
}

AWS DocumentDB Error: Client network socket disconnected before secure TLS connection was established

My AWS DocumentDB was working alright, but suddenly it started throwing the below error.
MongoServerSelectionError: Client network socket disconnected before secure TLS connection was established
at Timeout._onTimeout (app-path\node_modules\mongodb\lib\core\sdam\topology.js:438:30)
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7) {
reason: TopologyDescription {
type: 'ReplicaSetNoPrimary',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map {
'ServerEndpoint' => [ServerDescription]
},
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
}
}
I haven't made any changes in the environment both at the client or at the AWS Console end. I am not able to make head or tail of this.
Can someone suggest.

MongoServerSelectionError: connection <monitor> to 34.93.94.239:27017 closed - Nodejs

I am using MongoClient in nodejs to insert bulk records into a database. I am using async.eachOfLimit to do this in batches.
let cursor2 = await consultation_collection
.find({ processed: { $exists: false } })
.limit(limit)
.toArray();
await eachOfLimit(cursor2, 2, insertData);
However, after inserting about 50-60 records , I am constantly getting this error-
MongoServerSelectionError: connection <monitor> to 34.93.94.239:27017 closed
at Timeout._onTimeout (C:\Users\Santosh Chirag\Downloads\migrate-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: 'atlas-bagddj-shard-0',
maxSetVersion: null,
maxElectionId: null,
servers: Map(3) {
'medv5-dev-shard-00-00.to7mj.gcp.mongodb.net:27017' => [ServerDescription],
'medv5-dev-shard-00-01.to7mj.gcp.mongodb.net:27017' => [ServerDescription],
'medv5-dev-shard-00-02.to7mj.gcp.mongodb.net:27017' => [ServerDescription]
},
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: 30,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: 9
}
}
The code runs fine if I press enter , then it inserts 10-15 records more and this error occurs again continuously.
What is this error regarding and how to make Mongo stay connected till all the records have been inserted

Resources