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?


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


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


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


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.


1

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


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.


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:XXXX@cluster0-shard-00-00-ov74c.mongodb.net: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);
});

@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


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.


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


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

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.


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.


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.


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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.