MongoDB-Verbindungsfehler: MongoTimeoutError: Zeitüberschreitung bei der Serverauswahl nach 30000 ms

11

Ich versuche, eine Fullstack-App zu erstellen, indem ich das folgende Tutorial lese:

https://medium.com/javascript-in-plain-english/full-stack-mongodb-react-node-js-express-js-in-one-simple-app-6cc8ed6de274

Ich folgte allen Schritten und versuchte dann zu rennen:

node server.js

Aber ich habe folgenden Fehler bekommen:

MongoDB-Verbindungsfehler: MongoTimeoutError: Zeitüberschreitung bei der Serverauswahl nach 30000 ms bei Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ knotenmodule \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) bei listOnTimeout (intern / timers.js: 531: 17) bei processTimers (internal / timers.js: 475: 7) {name: 'MongoTimeoutError', Grund: Fehler: Verbindung ETIMEDOUT 99.80.11.208:27017 bei TCPConnectWrap.afterConnect [als oncomplete] (net. js: 1128: 14) {name: 'MongoNetworkError', [Symbol (mongoErrorContextSymbol)]: {}}, [Symbol (mongoErrorContextSymbol)]: {}} (Knoten: 42892) UnhandledPromiseRejectionWarning: MongoTimeoutError: ms Auswahl des Servers at Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ knotenmodule \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) bei listOnTimeout (intern / timers.js: 531: 17) bei processTimers (intern / timers.js: 475: 7)

Mein Code bei server.js lautet wie folgt:

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'));

Irgendwelche Vorschläge?

Arvind Krmar
quelle
1
Haben Sie user:passwordzu Ihrer username and passwordIn-Verbindungszeichenfolge gewechselt ?
Shivam Sood
@ ShivamSood Ja, ich habe
Arvind Krmar
Um die Informationen zu ergänzen, habe ich versucht, eine Verbindung mit der MongoDB-Kompass-Community herzustellen, aber es gab den gleichen Fehler. Können es einige Einstellungen bei atLas Mongodb sein?
Arvind Krmar
2
Die Anwendung läuft gut mit der lokalen MongoDB "mongodb: //127.0.0.1/FullStack". Anscheinend ist die Konnektivität zu atlas MongoDB das Problem.
Arvind Krmar
1
Ich kann es lösen. Firewall blockierte den Zugriff, das gleiche konnte damit getestet werden: portquiz.net:27017
Arvind Krmar

Antworten:

25

Gehen Sie einfach zum Administrationsbereich von mongodb atlas. Gehen Sie zur Registerkarte Sicherheit> Netzwerkzugriff> Führen Sie dann eine Whitelist für Ihre IP durch Hinzufügen durch

In diesem Bild finden Sie das jeweilige Menü

Hinweis: Überprüfen Sie Ihre IP bei Google und fügen Sie sie hinzu

kunal usapkar
quelle
2
Hab das gemacht, aber kein Glück. Eher habe ich alle IPs zugelassen, immer noch nicht funktioniert
Arvind Krmar
bro, hast du die DB Konfiguration richtig eingerichtet
kunal usapkar
Ich habe Rollen für den Datenbankzugriff erstellt: Benutzername: arvind Authentifizierungsmethode: SCRAM MongoDBRoles: atlasAdmin @ admin Muss ich etwas in Cluster oder 'Data Lake' erstellen?
Arvind Krmar
In der Lage, es zu lösen, war alles korrekt, aber die Firewall blockierte den Zugriff auf Port 27017. Gleiches kann hier getestet werden: portquiz.net:27017
Arvind Krmar
Okay, großartig, fröhliche Codierung
kunal usapkar
6

Stellen Sie sicher, dass "<" und ">" entfernt werden, wenn Sie die Benutzer- und Kennwortfelder ersetzen. Das hat bei mir funktioniert

Smartniggs
quelle
3

Manchmal tritt dieser Fehler aufgrund der IP-Adresse auf, die Zugriff auf unsere Datenbank erhält.

Wohlgemerkt, Ihre Anwendung kann gut funktionieren und dann auf einen solchen Fehler stoßen. In jedem Fall haben sich Ihre IP-Adressen geändert, was nicht auf der Whitelist der zulässigen Adresse steht.

Sie müssen lediglich die Whitelist mit Ihren aktuellen IP-Adressen aktualisieren

Odubola Oluwatimilehin
quelle
2

Whitelist Ihre Verbindungs-IP-Adresse. Atlas erlaubt Clientverbindungen zum Cluster nur über Einträge in der Whitelist des Projekts. Die Projekt-Whitelist unterscheidet sich von der API-Whitelist, die den API-Zugriff auf bestimmte IP- oder CIDR-Adressen beschränkt.

HINWEIS

Sie können diesen Schritt überspringen, wenn Atlas im Schritt "Verbindungssicherheit einrichten" angibt, dass Sie bereits einen Whitelist-Eintrag in Ihrem Cluster konfiguriert haben. Informationen zum Verwalten der IP-Whitelist finden Sie unter Hinzufügen von Einträgen zur Whitelist.

Wenn die Whitelist leer ist, werden Sie von Atlas aufgefordert, der Whitelist des Projekts eine IP-Adresse hinzuzufügen. Du kannst entweder:

Klicken Sie auf Ihre aktuelle IP-Adresse hinzufügen, um Ihre aktuelle IP-Adresse auf die Whitelist zu setzen.

Klicken Sie auf Eine andere IP-Adresse hinzufügen, um eine einzelne IP-Adresse oder einen CIDR-notierten Adressbereich hinzuzufügen.

Für Atlas-Cluster, die auf Amazon Web Services (AWS) bereitgestellt werden und VPC-Peering verwenden, können Sie eine Sicherheitsgruppe hinzufügen, die der Peer-VPC zugeordnet ist.

Sie können eine optionale Beschreibung für die neu hinzugefügte IP-Adresse oder den neu hinzugefügten CIDR-Bereich angeben. Klicken Sie auf IP-Adresse hinzufügen, um die Adresse zur Whitelist hinzuzufügen.

Kushal
quelle
1

Sie können das Flag {useUnifiedTopology: true} entfernen und die Abhängigkeit von Mungos neu installieren! es hat bei mir funktioniert.

Matheus
quelle
Wenn {useUnifiedTopology: true} entfernt wird, wird der folgende Fehler ausgegeben: (Knoten: 10020) DeprecationWarning: Die aktuelle Server Discovery and Monitoring-Engine ist veraltet und wird in einer zukünftigen Version entfernt. Übergeben Sie die Option {useUnifiedTopology: true} an den MongoClient-Konstruktor, um die neue Server-Erkennungs- und Überwachungs-Engine zu verwenden.
Arvind Krmar
1

Ich habe den gleichen Fehler bekommen. Dies sind die Schritte, die ich befolgt habe, um das Problem zu beheben

  1. Gehen Sie zur Registerkarte Sicherheit -> Netzwerkzugriff -> Dann Whitelist Ihrer IP
  2. Gehen Sie dann zur Registerkarte Sicherheit -> Datenbankzugriff -> und löschen Sie Ihren aktuellen Benutzer.
  3. Erstellen Sie einen neuen Benutzer, indem Sie einen neuen Benutzernamen und ein neues Passwort eingeben.
  4. Vorsehen , dass neu erstellte Benutzernamen und Passwort in der .env Datei oder mongoose.connect Methode

Nach diesen Schritten funktionierte es wie gewohnt. Ich hoffe, das wird euch helfen.

Bathiya Seneviratne
quelle
0

Du kannst es versuchen:

// Import express
let express = require('express');
// Import Body parser
let bodyParser = require('body-parser');
// Import Mongoose
let mongoose = require('mongoose');
// Initialize the app
let app = express();

// Import routes
let apiRoutes = require("./api-routes");
// Configure bodyparser to handle post requests
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// Connect to Mongoose and set connection variable
mongoose.connect('mongodb://XXXX:[email protected]:27017,cluster0-shard-00-01-ov74c.mongodb.net:27017,cluster0-shard-00-02-ov74c.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true&w=majority', {useNewUrlParser: true})
    .then(()=>console.log("DB server connect"))
    .catch(e => console.log("DB error", e));


var db = mongoose.connection;

// Added check for DB connection

if(!db)
    console.log("Error connecting db")
else
    console.log("Db connected successfully")

// Setup server port
var port = process.env.PORT || 8080;

// Send message for default URL
app.get('/', (req, res) => res.send('Hello World with Express'));

// Use Api routes in the App
app.use('/api', apiRoutes);
// Launch app to listen to specified port
app.listen(port, function () {
    console.log("Running RestHub on port " + port);
});
Umbro
quelle
@ArvindKrmar wenn Sie auf der Website Mongo angemeldet sind? Sie haben die Version ausgewählt node 3.00 or laterund `` mongodb + srv: // user: <password> @ cluster0-3zrv8.mongodb.net / test kopiert? RetryWrites = true & w = Mehrheit ''? Dort haben Sie drei Möglichkeiten zur Auswahl, wählen Sie den mittleren Knoten
Umbro
Ich habe den Knoten "Verbindung mit Ihrer Anwendung herstellen" ausgewählt und die obige Verbindungszeichenfolge kopiert, wobei das Kennwort ersetzt wurde. Ich bin mir jedoch nicht sicher, welches Kennwort es sein soll, mit welchem ​​Kennwort ich mich bei der atlast MongoDB angemeldet habe oder etwas anderes? Ich versuche es herauszufinden
Arvind Krmar
@ArvindKrmar Sie haben ein separates Datenbankkennwort angegeben
Umbro
Ich habe zwei Benutzer im Abschnitt "Datenbankzugriff" erstellt und das gleiche Kennwort beibehalten, mit dem ich mich bei mongoDB angemeldet habe, um die Sicherheit zu gewährleisten oder die Anwendung starten zu lassen, aber bisher kein Glück.
Arvind Krmar
1
Der Code funktioniert, wenn ich localhost "mongodb: //127.0.0.1/FullStack" verwende. Die Konnektivität zu atlas MongoDB hat also sicherlich ein Problem.
Arvind Krmar
0

Ich hatte dieses Problem, für mich war die Lösung zu überprüfen, ob meine IP richtig konfiguriert ist und bevor Sie in diesem Bildschirm bestätigen

Geben Sie hier die Bildbeschreibung ein

thiago rodrigues de santana
quelle
1
Ich habe die Lösung gefunden. Das Problem lag in den Firewall-Einstellungen meines Netzwerksystems. Mit portquiz.net:27017 kann getestet werden, ob die Verbindung hergestellt ist. Ich habe zwar die Firewall nicht geändert, da diese von Netzwerkadministratoren an meinem Ende verwaltet wird, aber sobald die Firewall korrigiert hat, funktioniert sie jetzt. Vielen Dank an alle für Vorschläge.
Arvind Krmar
0

Bitte überprüfen Sie Ihr Passwort, Ihren Benutzernamen oder Ihre IP-Konfiguration . Meistens tritt "Zeitüberschreitung bei der Serverauswahl nach 30000 ms bei Timeout._onTimeout" auf, wenn Ihre oben genannten Punkte nicht mit Ihrer Serverkonfiguration übereinstimmen.

Vaibhav
quelle
Es war ein Firewall-Problem an meinem Ende. Ich habe es korrigiert und jetzt funktioniert es
Arvind Krmar
0

Ich kann das Problem lösen. Alles war in Ordnung, aber die Firewall blockierte den Zugriff auf Port 27017. Die Konnektivität kann unter http://portquiz.net:27017/ oder über Telnet zum Endpunkt getestet werden, der aus Clustern-> Metriken abgerufen werden kann.

Vielen Dank an alle für die Vorschläge

Arvind Krmar
quelle
0

Versuchen Sie, einen neuen Benutzer im Datenbankzugriff mit der Standardauthentifizierungsmethode "SCRAM" zu erstellen. Dann machen Sie dafür einen neuen Cluster. Es hat bei mir funktioniert! Meine server.js Datei

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:[email protected]/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}`);
});
Adarsh ​​Pawar
quelle
0

Was ist deine Mungo-Version? weil es ein Problem mit einer bestimmten Mungo-Version gibt. Bitte besuchen Sie diesen Link für weitere Details " https://github.com/Automattic/mongoose/issues/8180 ". Wie auch immer, ich hatte das gleiche Problem, aber nachdem ich eine ältere Version (5.5.2) verwendet hatte, funktionierte es für mich. Bitte versuchen Sie es und lassen Sie mich wissen, was passiert ist.

Walid Ahmed
quelle
Ich hatte das gleiche Problem, entwickelte es jedoch häufig, wenn mein VPN ein- und ausgeschaltet war. Durch erneutes Einschalten meines VPN konnte ich eine Verbindung zur Datenbank herstellen. Ich hoffe, dass dieses Problem nur vorübergehend ist, da ich mein VPN nicht immer eingeschaltet haben kann.
Mike K
0

Dies kann im Grunde an einem npm-Update liegen. Ich habe gerade auf npm v 6.13.7 aktualisiert. und ich fing an, diesen Fehler zu bekommen.

Den Anweisungen von @Matheus folgend, habe ich die Zeile "{useUnifiedTopology: true}" kommentiert und konnte sie durchstehen.

Ich habe Mungo aktualisiert und alles funktioniert gut.

Foz
quelle
0

Verwenden Sie Antivirus, Firewall, VPN oder ein eingeschränktes Netzwerk (z. B. geschäftliche / kommerzielle Wi-Fi / LAN-Verbindung)? Versuchen Sie dann, es auszuschalten / erneut mit einem anderen Netzwerk zu verbinden. Einige IPs / Verbindungen werden möglicherweise vom Administrator eines von Ihnen verwendeten Netzwerks blockiert, oder Antivirus verfügt möglicherweise über Firewall-Richtlinien. Auch wenn Sie 0.0.0.0in Ihrem IP Addressbeim MongoDB Atlas haben.

Daniel Danielecki
quelle
0

Ich hatte das gleiche Problem. Ich konnte über die von Atlas angegebenen Verbindungszeichenfolgen eine Verbindung über MongoDB Compass oder meine Node-App herstellen. Ich habe das Problem behoben, indem ich meine IP-Adresse zur Whitelist in Atlas hinzugefügt habe.

rekwet
quelle
0

An alle, die sich noch mit diesem Thema auseinandersetzen. Ich habe dieses Problem behoben, indem ich alle Parameter wie Benutzername, Passwort und Datenbankname in den Mungo-Optionen selbst festgelegt habe.

Früher war der Code so. (Als ich den Fehler bekam).

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;
    }
});

Beachten Sie, dass URL in Mongo verbinden. mongodb://${dbAddress}:${dbPort}/${dbName}.

Neuer Code ohne Fehler.

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;
    }
});

Beachten Sie die Optionen und die URL.

Dies ist meine lokale Umgebung. Nicht Produktionsumgebung.

Hoffe es wird hilfreich sein.

Lalit Sharma
quelle
0

Versuchen Sie, den Knotentreiber, Version 2,2,12, im Cluster anzugeben -> Verbinden -> Verbinden Sie Ihre Anwendung. neue Zeichenfolge muss mit mongodb: // sein. Verwenden Sie diese Zeichenfolge, um eine Verbindung herzustellen. Vergessen Sie nicht, ein Passwort einzugeben

dkovskij
quelle