How do i resolve this Mongo Server Selection Error - node.js

Am quiet new to backend and database. I have a solution currently using mongodb. It was working fine till yesterday when i starting having the connect ETIMEDOUT 13.37.254.237:27017 error. Nothing was changed in the URI path or tampered with. It just started and i have not been able to sort it out.
is there any help available please?
I have created another cluster and its working well. But my initial cluster that has datas which are live from clients is not connecting still.
My connection code
I have used these connections code but it has not worked. It was connecting fine all through yesterday but today without tampering with the code, couldn't connect to my mongodb
mongoose.connect(process.env.MONGO_URI,{ useNewUrlParser: true, useUnifiedTopology: true });
const connectDB = async () => {
try {
const conn = await mongoose.connect(process.env.MONGO_URL);
console.log(`MongoDB Connected: ${conn.connection.host}`);
} catch (error) {
console.log(error);
process.exit(1);
}
};
my mongoose connection and the timedout error

Whenever you connect to Mongodb using IPs that keep updating from your system causes this kind of issues.
also this can be due to your network connection. So i will advice you to:
To allow connection from any IP address(but must ensure your URI is not made known to the public to avoid attack/ access from unwanted users.)
2.Check your network status(data)
3. Run the mongo URI on your atlas

Related

VPS not respond to request MongoDB-NodeJS

I bought a VPS server and installed Nodejs and Mongodb in it. Then I transferred my existing database file to mongodb, which I set up on VPS. I made the connection via NodeJS. The database seems to be working, but when I make a request, for example http://serverip:port/fetchData, I get the following error
'It looks like you are trying to access MongoDB over HTTP on the native driver port.'
could you please help me to solve this problem?
Here is NodeJs connection code
const URL = "mongodb://serverIp:port/dbname";
const connection = mongoose
.connect(URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
serverSelectionTimeoutMS: 5000,
family:4
})
.then(() => console.log("Successfully Connected DB"))
.catch((e) => console.log("DB CONNECTION ERROR: "+e));
module.export = connection;
Note --> I added my desktop ip to access mongodb database and I can easily manage with my own desktop
HTTP interface for MongoDB Deprecated since version 3.2 :)
Check Mongo Docs: HTTP Status Interface

Why does local Robo3t connect to a remote Mongo DB instance, but NodeJs fails with IP whitelist error?

I am having issues connecting to MongoDb running remotely, and the connection error response I am getting from the server is somewhat weird.
My network access whitelist is set to allow all (0.0.0.0/0). Hence, my local robo3t installation was able to connect. However, I could not connect from my NodeJs code. Error is: "MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist"
IP whitelist seems to be an unlikely error, given that my local robo3t client is able to connect remotely to the same remote Mongo Atlas instance, as IP whitelist is allow-all.
How do I debug this kind of thing, please?
UPDATE: this is how I connect to MongoDb. Works well on local, too.
try {
const connectionString =
process.env.APP_ENV == "test"
? await getInMemoryMongoDbAdapter()
: `mongodb://${process.env.MONGODB_HOSTNAME}:${process.env.MONGODB_PORT}/${process.env.CBT_DATABASE_NAME}`;
logger.info(`Connecting to MongoDB service: ${connectionString}`);
await mongoose.connect(connectionString, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
} catch (error) {
reject(error);
}
The logger line correctly shows: Connecting to MongoDB service: mongodb://<user>:<password>#cluster0-xxx.yyy.zzz.net:<port>/<database>
UPDATE 2:
My localhost also does not connect via this node app; whereas my robo3t (local MongoDb client) connects. I guess that means Heroku-specific issues can now be comfortably ruled out
A decade later, I found that for the connection parameters, I needed to supply the authSource and ssl options, as below:
{
useNewUrlParser: true,
useUnifiedTopology: true,
authSource: "admin",
ssl: true,
}
Neither one works without the other. Big shout-out to #darklightcode for all the insights he gave, leading me to dig deeper. Thanks man!

Can't connect to MongoDB Atlas from CentOS using NodeJS

I've created a cluster on MongoDB Atlas and have successfully connected to it using Compass and also using Node running locally.
When I try to run the same code on my CentOS machine i get an ECONNREFUSEDerror. Here is my Node code
const MongoClient = require('mongodb').MongoClient;
const uri = "mongodb+srv://myuser:mypass#tablematic-0-z4nuk.gcp.mongodb.net/test?retryWrites=true&w=majority";
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
const collection = client.db("test").collection("devices");
console.log("ERROR: " + err);
client.close();
});
myuser and mypass are replaced by my actual username and password here.
I've opened up server's firewall for ports 27015, 27016 and 27017.
Atlas is set up to accept connections from any incoming IP.
I really can't think of what might be causing it...
I've figured it out. It ended up being the cPanel Firewall, even though I've opened the ports through firewall-cmd, my cPanel was still bypassing that configuration with its own firewall.
I'm not 100% sure but my connection strings are usually like
mongodb://user:pass#host.app:27017/db_name

MongoDB connection error: MongoTimeoutError: Server selection timed out after 30000 ms

I am trying to create a fullstack app reading the following tutorial:
https://medium.com/javascript-in-plain-english/full-stack-mongodb-react-node-js-express-js-in-one-simple-app-6cc8ed6de274
I followed all steps and then tried to run:
node server.js
But I got the following error:
MongoDB connection error: MongoTimeoutError: Server selection timed
out after 30000 ms
at Timeout._onTimeout (C:\RND\fullstack_app\backend\node_modules\mongodb\lib\core\sdam\server_selection.js:308:9)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7) { name: 'MongoTimeoutError', reason: Error: connect ETIMEDOUT
99.80.11.208:27017
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1128:14) {
name: 'MongoNetworkError',
[Symbol(mongoErrorContextSymbol)]: {} }, [Symbol(mongoErrorContextSymbol)]: {} } (node:42892)
UnhandledPromiseRejectionWarning: MongoTimeoutError: Server selection
timed out after 30000 ms
at Timeout._onTimeout (C:\RND\fullstack_app\backend\node_modules\mongodb\lib\core\sdam\server_selection.js:308:9)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
My code at server.js is as follows:
const mongoose = require('mongoose');
const router = express.Router();
// this is our MongoDB database
const dbRoute =
'mongodb+srv://user:<password>#cluster0-3zrv8.mongodb.net/test?retryWrites=true&w=majority';
mongoose.Promise = global.Promise;
// connects our back end code with the database
mongoose.connect(dbRoute,
{ useNewUrlParser: true,
useUnifiedTopology: true
});
let db = mongoose.connection;
db.once('open', () => console.log('connected to the database'));
Any suggestions?
just go to mongodb atlas admin panel.Go in security tab>Network Access> Then whitelist your IP by adding it
See this image to locate the particular menu
Note:Check your IP on google then add it
I wasted whole day on this because the whitelist suggestion was not my issue (I'm running in docker compose with --bind_ip option set properly and I can see the Connection accepted in the mongo logs each time my client tried to connection).
It turns out, I simply needed to add this to the end of my connection string in the code:
?directConnection=true
connection string:
mongodb://myUserId:myPassword#mongodb/myDatabase?directConnection=true
I hope mongodb documents this better because I only stumbled across it from looking at the mongosh logs when I connected using that client.
Sometimes this error occurs due to the IP Address given access to in your database.
Mind you, your application can be working well then come up with such an error.
Anytime this happens, most times your IP address has changed, which is not on the whitelist of addresses allowed. (IP addresses can be dynamic and are subject to change)
All you have to do is to update the whitelist with your current IP addresses
Sometimes it will also happen when your MongoDB services are turned OFF.
Here are the steps to Turn ON the MongoDB Services:
Press window key + R to open Run window.
Then type services.msc to open services window.
Then select MongoDB server, right-click on it, finally click on the start.
I got the same error. These are the steps I followed for resolve it
Log into your Mongo Atlas account
Go to the security tab -> Network Access -> Then whitelist your IP
Then go to the security tab -> Database Access -> and delete your current user.
Create a new user by providing new username and password.
Provide that newly created username and password in the .env file or mongoose.connect method
After these steps it worked as usual. hope this will help you guys.
Ensure that the "<" and ">" are removed when you replace the user and password fields. This worked for me
In my case, this issue happened after NodeJS version upgrade from Node 14 to Node 17 and the mongoose was not connecting to MongoDB in local.
Solution - In connection string, change localhost to 127.0.0.1.
Ref - https://github.com/Automattic/mongoose/issues/10917#issuecomment-957671662
Are you using any Antivirus, Firewall, VPN or on the restricted network (e.g. work/commercial Wi-Fi/LAN connection)? Then try to turn it off/reconnect to a different network. Some IPs/connections might be blocked by the administrator of a network that you're using or simply antivirus might have firewall policies. Even though if you have 0.0.0.0 in your IP Address at the MongoDB Atlas.
I am able to solve the issue. Everything was fine, but the firewall was blocking access to port 27017. connectivity can be tested at http://portquiz.net:27017/ or using telnet to the endpoint which can be retrieved from clusters->Metrics.
Thanks, everybody for the suggestions
Whitelist your connection IP address.
Atlas only allows client connections to the cluster from entries in the project’s whitelist. The project whitelist is distinct from the API whitelist, which restricts API access to specific IP or CIDR addresses.
NOTE
You can skip this step if Atlas indicates in the Setup Connection Security step that you have already configured a whitelist entry in your cluster. To manage the IP whitelist, see Add Entries to the Whitelist.
If the whitelist is empty, Atlas prompts you to add an IP address to the project’s whitelist. You can either:
Click Add Your Current IP Address to whitelist your current IP address.
Click Add a Different IP Address to add a single IP address or a CIDR-notated range of addresses.
For Atlas clusters deployed on Amazon Web Services (AWS) and using VPC Peering, you can add a Security Group associated with the peer VPC.
You can provide an optional description for the newly added IP address or CIDR range. Click Add IP Address to add the address to the whitelist.
You can remove { useUnifiedTopology: true } flag and reinstall mongoose dependecy!
it worked for me.
To anyone still struggling through this issue. I resolved this issue by setting all the parameters like username, password and dbName in mongoose options itself.
Earlier the code was like this. (When I was getting the error).
import mongoose from "mongoose";
mongoose.Promise = require("bluebird");
let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
if(!dbName || !dbAddress || !dbPort){
throw new Error("Mongo error unable to configuredatabase");
}
let options = {
useNewUrlParser: true,
useUnifiedTopology: true,
user:process.env.DB_USER,
pass: process.env.DB_PASS
};
mongoose.connect(`mongodb://${dbAddress}:${dbPort}/${dbName}`, options).catch(err => {
if (err.message.indexOf("ECONNREFUSED") !== -1) {
console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
process.exit(1);
} else {
throw err;
}
});
Note that url in mongo connect. mongodb://${dbAddress}:${dbPort}/${dbName}.
New code without error.
import mongoose from "mongoose";
mongoose.Promise = require("bluebird");
let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
// console.log("process.env", process.env)
if(!dbName || !dbAddress || !dbPort){
throw new Error("Mongo error unable to configuredatabase");
}
let options = {
useNewUrlParser: true,
useUnifiedTopology: true,
user:process.env.DB_USER,
pass: process.env.DB_PASS,
dbName: dbName
};
mongoose.connect(`mongodb://${dbAddress}:${dbPort}`, options).catch(err => {
if (err.message.indexOf("ECONNREFUSED") !== -1) {
console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
process.exit(1);
} else {
throw err;
}
});
Note the options and the url.
This is my local env. Not production env.
Hope It'll be helpful.
try to specify the node driver, version 2,2,12 in cluster --> connect --> connect your application. new string must be with mongodb://. use this string to connect. do not forget to enter a password
Most of the answers present in this thread should fix you're issue, I tried all the answers and whitelisted all the IP's but still I was not able to connect to the database.
Interestingly, my system was connected to a VPN while I was trying to connect to the mongo atlas. So, I just disconnected the VPN and was able to connect to the db. This was just an simple issue due to which I was not able to connect to the database.
i was has this problem, to me the solution was check if my ip be configured correctly and before confirm in this screen
enter image description here
Please Check your Password, Username OR IP configuration. Mostly "Server selection timed out after 30000 ms at Timeout._onTimeout" comes whenever your above things are not matched with your server configuration.
Try to make new User in Database Access with the default Authentication Method which is "SCRAM". Then make a new Cluster for that. It worked for me! My
server.js file
const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
//const uri = process.env.ATLAS_URI;
mongoose.createConnection("mongodb+srv://u1:u1#cluster0-u3zl8.mongodb.net/test", { userNewParser: true, useCreateIndex: true, useUnifiedTopology: true}
);
const connection = mongoose.connection;
connection.once('once', () => {
console.log(`MongoDB databse connection established successfully`);
})
app.listen(port, () => {
console.log(`Server is running on port: ${port}`);
});
What is your mongoose version? because there is an issue with a certain mongoose version. Please visit this link for more details "https://github.com/Automattic/mongoose/issues/8180". Anyway, I was facing the same issue but after using an older version (5.5.2), it worked for me. Please give a try and let me know what happened.
It might basically be because of an npm update.
I just updated to npm v 6.13.7. and I began to get that error.
Following instructions from #Matheus, I commented the line "{ useUnifiedTopology: true }" and I was able to get through it.
I updated mongoose and everything works fine.
I had the same issue. I could connect from MongoDB Compass or my Node app using the connection strings Atlas gave me. I resolved it by adding my IP Address into the Whitelist in Atlas.
For anyone who may face this problem with mongoose v6+ and nodejs and white listing your ip has not solved it or changing from localhost to 127.0.0.1.
Solution
Set the following options for the mongoose client connection options:
mongoose.connect(url, {
maxIdleTimeMS: 80000,
serverSelectionTimeoutMS: 80000,
socketTimeoutMS: 0,
connectTimeoutMS: 0
}
These options stop the mongoose client from timining out the connection before it selects a primary from the DB cluster.
Please remember to set any other options relevant to your setup like if you are running a cluster, make sure to set the replicaSet option or if you have authentication enabled, set the authSource option or the database you are connecting to dbName.
Some of these options can be set in the connection string.
The full list of options can be found here: https://mongodb.github.io/node-mongodb-native/4.2/interfaces/MongoClientOptions.html#authSource
This must be a temporary network issue. Please try to connect after some time and hopefully it should be fine. but make sure you white list your ip address.
If your config is alright and still the error shows up, it maybe because of too much data in the db (Like for me, I am using the free tier for testing my app where I upload posts and the posts are images with some description), so I just deleted the db and it worked fine after that. Hope this helps someone.
I have solved this problem by using the following way, use a callback.
const uri = '';
mongoose
.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }, () => {
console.log("we are connected");
})
.catch((err) => console.log(err));
Newer versions of Mongoose and MongoDB require your application port higher than 5000.
If your app running on port 3000 for example, you'll have this error message.
I just changed my PORT from 3000 to 5556 and I'm fine 🎉

MongoDB connection error getaddrinfo ENOTFOUND Cluster0_shard_name

I'm having an issue with trying to connect to MongoDB. I'm using mongoose here,
console.log("trying here"); // prints
await mongoose.connect(db, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false
});
console.log("Mongo DB connected"); // never reached
And it throws an error
getaddrinfo ENOTFOUND cluster0-shard-00-01-abcde.mongodb.net
I have never had this error before, it used to work just fine -- not sure where to go from here. I've tried building a new cluster and network access by IP is set to public 0.0.0.0. It just keeps throwing the same error.
Note that if you specify useNewUrlParser: true, you must specify a port in your connection string,
like mongodb://localhost:27017/dbname.
The new url parser does not support connection strings that do not have a port, like mongodb://localhost/dbname.
see more info here
one more option, if you use node.js +mongo Atlas:
log in https://cloud.mongodb.com/
go to your cluster0 or
other cluster,
click connect... choose connet your application
choose node.js and then 2.2.12 or later -
you will get connection string that start with mongodb://
insted of mongodb+srv:// (for node js 3.0 or later)
I was facing same error.
How are you using your mongo connection string? and what is your mongoose version?
if your using a latest version of mongoose try using like below string
I changed my string from
mongodb://<user>:<password>...
to
mongodb+srv://<user>:<password>...
check your CONNECTION :
Quick fix is checking your connection, this error happens while your connection is not stable and it've tried to connect more than 30 sc without any success.
//checks connection status
mongoose.connection.on("connected", () => console.log("mongoDb connected!"));
mongoose.connection.on("disconnected", () => console.log("mongoDb disconnected!"));

Resources