Błąd połączenia MongoDB: MongoTimeoutError: Upłynął limit czasu wyboru serwera po 30000 ms

11

Próbuję utworzyć aplikację fullstack, czytając następujący samouczek:

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

Wykonałem wszystkie kroki, a następnie próbowałem uruchomić:

node server.js

Ale dostałem następujący błąd:

Błąd połączenia MongoDB: MongoTimeoutError: Upłynął limit czasu wyboru serwera po 30000 ms w Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) at listOnTimeout (wewnętrzny / timers.js: 531: 17) w processTimers (Internal / timers.js: 475: 7) {name: 'MongoTimeoutError', przyczyna: Błąd: podłącz ETIMEDOUT 99.80.11.208:27017 w TCPConnectWrap.afterConnect [as oncomplete] (netto. js: 1128: 14) {nazwa: „MongoNetworkError”, [Symbol (mongoErrorContextSymbol)]: {}}, [Symbol (mongoErrorContextSymbol)]: {}} (węzeł: 42892) UnhandledPromiseRejectionWarning: MongoTimeoutError: Upłynął limit czasu wyboru serwera 30000 at Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) w listOnTimeout (wewnętrzny / timers.js: 531: 17) w processTimers (wewnętrzny / timers.js: 475: 7)

Mój kod na server.js jest następujący:

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

Jakieś sugestie?

Arvind Krmar
źródło
1
Czy zmienił się user:passworddo username and passwordciągu połączenia w?
Shivam Sood,
@ShivamSood Tak, zrobiłem
Arvind Krmar
Aby dodać do informacji, próbowałem połączyć się za pomocą społeczności kompasu MongoDB, ale dał ten sam błąd. Czy mogą to być niektóre ustawienia w atLas Mongodb?
Arvind Krmar
2
aplikacja działa dobrze z lokalnym MongoDB „mongodb: //127.0.0.1/FullStack”. Pojawia się łączność z atlasem MongoDB jest problemem.
Arvind Krmar
1
Jestem w stanie to rozwiązać. Zapora blokowała dostęp, to samo można przetestować za pomocą tego: portquiz.net:27017
Arvind Krmar

Odpowiedzi:

25

po prostu przejdź do panelu administracyjnego mongodb atlas. Przejdź do zakładki bezpieczeństwa> Dostęp do sieci> Następnie dodaj adres IP do białej listy, dodając go

Zobacz ten obraz, aby znaleźć określone menu

Uwaga: sprawdź swój adres IP w Google, a następnie dodaj go

kunal usapkar
źródło
2
Zrobiłem to, ale bez powodzenia. Pozwoliłem raczej na wszystkie adresy IP, nadal nie
działałem
brachu, czy poprawnie skonfigurowałeś konfigurację DB
kunal usapkar
Utworzyłem role dostępu do bazy danych: nazwa użytkownika: arvind Metoda uwierzytelniania: SCRAM MongoDBRoles: atlasAdmin @ admin Czy muszę utworzyć coś w klastrze lub „Data Lake”?
Arvind Krmar
mogłem to rozwiązać, wszystko było w porządku
Arvind Krmar
ok, świetnie, szczęśliwy, kodowanie
kunal usapkar
6

Upewnij się, że „<” i „>” zostały usunięte po zamianie pól użytkownika i hasła. To zadziałało dla mnie

Smartniggs
źródło
3

Czasami ten błąd występuje z powodu dostępu adresu IP do naszej bazy danych.

Pamiętaj, że Twoja aplikacja może działać dobrze, a następnie wymyślić taki błąd. Za każdym razem, gdy tak się dzieje, najczęściej zmieniają się adresy IP użytkownika, co nie znajduje się na białej liście dozwolonych adresów.

Wystarczy, że zaktualizujesz białą listę o swoje obecne adresy IP

Odubola Oluwatimilehin
źródło
2

Umieść na liście adres IP swojego połączenia. Atlas zezwala na połączenia klientów z klastrem tylko z wpisów na białej liście projektu. Biała lista projektu różni się od białej listy API, która ogranicza dostęp API do określonych adresów IP lub CIDR.

UWAGA

Możesz pominąć ten krok, jeśli Atlas wskaże w kroku Konfiguracja zabezpieczeń połączeń, że skonfigurowałeś już pozycję białej listy w klastrze. Aby zarządzać białą listą adresów IP, zobacz Dodawanie wpisów do białej listy.

Jeśli biała lista jest pusta, Atlas wyświetli monit o dodanie adresu IP do białej listy projektu. Możesz albo:

Kliknij Dodaj swój aktualny adres IP, aby dodać swój aktualny adres do białej listy.

Kliknij opcję Dodaj inny adres IP, aby dodać pojedynczy adres IP lub zakres adresów zapisany w CIDR.

W przypadku klastrów Atlas wdrożonych w Amazon Web Services (AWS) i przy użyciu komunikacji VPC Peering można dodać grupę zabezpieczeń powiązaną z równorzędnym VPC.

Możesz podać opcjonalny opis nowo dodanego adresu IP lub zakresu CIDR. Kliknij Dodaj adres IP, aby dodać adres do białej listy.

Kushal
źródło
1

Możesz usunąć flagę {useUnifiedTopology: true} i ponownie zainstalować zależność mangusty! zadziałało dla mnie.

Matheus
źródło
wyświetla następujący błąd, gdy {useUnifiedTopology: true} usunięto: (węzeł: 10020) DeprecationWarning: bieżący silnik wykrywania i monitorowania serwera jest przestarzały i zostanie usunięty w przyszłej wersji. Aby użyć nowego silnika wykrywania i monitorowania serwera, przekaż opcję {useUnifiedTopology: true} do konstruktora MongoClient.
Arvind Krmar
1

Mam ten sam błąd. Oto kroki, które podjąłem, aby to rozwiązać

  1. Przejdź do zakładki bezpieczeństwa -> Dostęp do sieci -> Następnie umieść na białej liście swój adres IP
  2. Następnie przejdź do zakładki bezpieczeństwa -> Dostęp do bazy danych -> i usuń bieżącego użytkownika.
  3. Utwórz nowego użytkownika, podając nową nazwę użytkownika i hasło.
  4. Przewidują, że nowo utworzoną nazwę użytkownika i hasło w .env pliku lub mongoose.connect metody

Po tych krokach zadziałało jak zwykle. mam nadzieję, że to wam pomoże.

Bathiya Seneviratne
źródło
0

Możesz spróbować:

// 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
źródło
@ArvindKrmar, jeśli jesteś zalogowany na stronie Mongo? Wybrałeś wersję node 3.00 or lateri skopiowałeś `` mongodb + srv: // user: <hasło> @uster0-3zrv8.mongodb.net / test? RetryWrites = true & w = większość ''? Tam masz trzy opcje do wyboru, wybierz środkowy węzeł
Umbro
Wybrałem węzeł „Połącz swoją aplikację” i skopiowałem powyższy ciąg połączenia, zastępując hasło, jednak nie jestem pewien, jakie powinno być hasło, hasło, za pomocą którego zalogowałem się do atlast MongoDB czy coś innego? Próbuję się dowiedzieć
Arvind Krmar
@ArvindKrmar podałeś osobne hasło do bazy danych
Umbro
Utworzyłem dwóch użytkowników w sekcji „Dostęp do bazy danych” i zachowałem to samo hasło, które logowałem w mongoDB, aby zachować bezpieczeństwo dla dobra lub pozwolić aplikacji na uruchomienie, ale jak dotąd nie na szczęście.
Arvind Krmar
1
Kod działa, gdy używam localhost „mongodb: //127.0.0.1/FullStack”. Tak więc z pewnością łączność z atlasem MongoDB ma pewien problem.
Arvind Krmar
0

miałem ten problem, dla mnie rozwiązaniem było sprawdzenie, czy mój adres IP jest poprawnie skonfigurowany i przed potwierdzeniem na tym ekranie

wprowadź opis zdjęcia tutaj

Thiago Rodrigues de Santana
źródło
1
Znalazłem rozwiązanie. Problem dotyczył ustawień zapory w moim systemie sieciowym. portquiz.net:27017 można wykorzystać do przetestowania, czy połączenie zostało nawiązane. Chociaż nie zmieniłem zapory, ponieważ jest ona zarządzana przez administratorów sieci na moim końcu, ale kiedy zapora poprawiła teraz swoją pracę. Dziękuję wszystkim za sugestie.
Arvind Krmar
0

Proszę sprawdzić swoje hasło, nazwa użytkownika lub konfiguracji IP . Przeważnie „Upłynął limit czasu wyboru serwera po 30000 ms o Timeout._onTimeout”, ilekroć powyższe rzeczy nie są dopasowane do konfiguracji serwera.

Vaibhav
źródło
to był problem zapory na moim końcu. Poprawiłem to i teraz działa
Arvind Krmar
0

Jestem w stanie rozwiązać problem. Wszystko było w porządku, ale zapora blokowała dostęp do portu 27017. Łączność można przetestować pod adresem http://portquiz.net:27017/ lub za pomocą telnetu do punktu końcowego, który można pobrać z klastrów-> Metryki.

Dziękujemy wszystkim za sugestie

Arvind Krmar
źródło
0

Spróbuj utworzyć nowego użytkownika w dostępie do bazy danych przy użyciu domyślnej metody uwierzytelniania, czyli „SCRAM”. Następnie stwórz nowy Klaster. To zadziałało dla mnie! Mój plik server.js

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
źródło
0

Jaka jest twoja wersja mangusty? ponieważ występuje problem z pewną wersją mangusty. Proszę odwiedzić ten link, aby uzyskać więcej informacji „ https://github.com/Automattic/mongoose/issues/8180 ”. W każdym razie miałem ten sam problem, ale po użyciu starszej wersji (5.5.2), zadziałało to dla mnie. Spróbuj i daj mi znać, co się stało.

Walid Ahmed
źródło
Miałem ten sam problem, jednak często rozwijam się z włączoną i wyłączoną siecią VPN. Po ponownym włączeniu VPN udało mi się połączyć z bazą danych. Mam nadzieję, że ten problem jest tymczasowy, ponieważ nie zawsze mam włączony VPN.
Mike K.
0

Może to być po prostu spowodowane aktualizacją npm. Właśnie zaktualizowałem do npm v 6.13.7. i zacząłem otrzymywać ten błąd.

Postępując zgodnie z instrukcjami @ Matheus, skomentowałem wiersz „{useUnifiedTopology: true}” i udało mi się go przejść.

Zaktualizowałem mangustę i wszystko działa dobrze.

Foz
źródło
0

Czy korzystasz z programu antywirusowego, zapory ogniowej, VPN lub w sieci o ograniczonym dostępie (np. W pracy / komercyjnym połączeniu Wi-Fi / LAN)? Następnie spróbuj go wyłączyć / połączyć ponownie z inną siecią. Niektóre adresy IP / połączenia mogą być blokowane przez administratora używanej sieci lub po prostu program antywirusowy może mieć zasady zapory. Nawet jeśli masz 0.0.0.0w IP Addressatlas MongoDB.

Daniel Danielecki
źródło
0

Miałem ten sam problem. Mógłbym połączyć się z MongoDB Compass lub mojej aplikacji Node za pomocą parametrów połączenia, które dał mi Atlas. Rozwiązałem go, dodając mój adres IP do białej listy w Atlasie.

rekwet
źródło
0

Do każdego, kto wciąż zmaga się z tym problemem. Rozwiązałem ten problem, ustawiając wszystkie parametry, takie jak nazwa użytkownika, hasło i dbName w samych opcjach mangusty.

Wcześniej taki kod był. (Kiedy otrzymywałem błąd).

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

Pamiętaj, że URL w Mongo Connect. mongodb://${dbAddress}:${dbPort}/${dbName}.

Nowy kod bez błędów.

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

Zwróć uwagę na opcje i adres URL.

To jest moja lokalna env. Nie środowisko produkcji

Mam nadzieję, że to będzie pomocne.

Lalit Sharma
źródło
0

spróbuj określić sterownik węzła, wersja 2,2,12 w klastrze -> połącz -> połącz swoją aplikację. nowy ciąg musi być w mongodb: //. użyj tego ciągu, aby się połączyć. nie zapomnij podać hasła

dkovskij
źródło