Помилка підключення MongoDB: MongoTimeoutError: Вибір сервера закінчився через 30000 мс


11

Я намагаюся створити повний стек-додаток, читаючи наступний підручник:

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

Я дотримувався всіх кроків, а потім спробував запустити:

node server.js

Але я отримав таку помилку:

Помилка підключення MongoDB: MongoTimeoutError: Вибір сервера закінчився після 30000 мс у Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) у listOnTimeout (внутрішній / timers.js: 531: 17) у ProcessTimers (внутрішній / timers.js: 475: 7) {name: 'MongoTimeoutError', причина: Помилка: підключіть ETIMEDOUT 99.80.11.208:27017 на TCPConnectWrap.afterConnect [як не завершено] (нетто). js: 1128: 14) {name: 'MongoNetworkError', [Symbol (mongoErrorContextSymbol)]: {}}, [Symbol (mongoErrorContextSymbol)]: {}} (вузол: 42892) UnhandledPromiseRejectionWarning: Вибір MongoTimeoutEnner Outror у Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) у listOnTimeout (внутрішній / timers.js: 531: 17) у ProcessTimers (внутрішній / timers.js: 475: 7)

Мій код на server.js такий:

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

Будь-які пропозиції?


1
Ви змінили user:passwordсвій username and passwordрядок з'єднання?
Шивам Суд

@ShivamSood Так, я
Арвінд

Щоб додати до інформації, я намагався підключитися за допомогою спільноти MongoDB compass, але це дало таку ж помилку. Чи можуть це бути деякі налаштування у atLas Mongodb?
Арвінд

2
програма добре працює з локальним MongoDB "mongodb: //127.0.0.1/FullStack". Виявляється, зв'язок з атласом MongoDB є проблемою.
Арвінд

1
Я вмію це вирішити. Firewall блокував доступ, те ж саме можна було б перевірити з цим: portquiz.net:27017
ARVIND Krmar

Відповіді:


25

просто перейдіть на панель адміністратора mongodb atlas. Перейдіть на вкладку безпеки> Доступ до мережі> Потім додайте в білий список вашого IP-адреси, додавши його

Дивіться це зображення, щоб знайти конкретне меню

Примітка. Перевірте свій IP-адрес у google та додайте його


2
Зробив це, але не пощастило. Швидше я дозволив усі IP-адреси, все ще не працював
Арвінд

брато, чи правильно ви налаштували конфігурацію БД
kunal usapkar

Я створив ролі для доступу до db: ім'я користувача: arvind Метод автентифікації: SCRAM MongoDBRoles: atlasAdmin @ admin Чи потрібно створити щось у кластері або «Data Lake»?
Арвінд

в змозі вирішити цю проблему, все було правильно, але брандмауер був заблокований доступ до порту 27017 же можна протестувати тут: portquiz.net:27017
Ервінд Krmar

гаразд, велике щасливе кодування
kunal usapkar

6

Переконайтеся, що "<" і ">" видалено під час заміни полів користувача та пароля. Це працювало для мене


3

Іноді ця помилка виникає через IP-адресу, надану доступ до нашої бази даних.

Зауважте, ваша програма може працювати добре, тоді виникла така помилка. У будь-який час цього трапляється, і в більшості випадків ваші IP-адреси змінюються, що не міститься в дозволеному списку адрес

Все, що вам потрібно зробити - це оновити білий список з вашими поточними IP-адресами


2

Білий список IP-адреси вашого з'єднання. Atlas дозволяє лише підключення клієнта до кластеру із записів у списку проекту. Білий список проектів відрізняється від білого списку API, який обмежує доступ API до конкретних IP або CIDR адрес.

ПРИМІТКА

Ви можете пропустити цей крок, якщо Atlas в кроці захисту підключення до налаштування вкаже, що ви вже налаштували запис білого списку у своєму кластері. Щоб керувати білим списком IP, див. Додавання записів до білого списку.

Якщо білий список порожній, Atlas запропонує вам додати IP-адресу до білого списку проекту. Ви можете:

Клацніть Додати свою поточну IP-адресу, щоб додати білий список вашої поточної IP-адреси.

Клацніть Додати іншу IP-адресу, щоб додати одну IP-адресу або діапазон адрес, позначений CIDR.

Для кластерів Atlas, розгорнутих у веб-службах Amazon (AWS) та використовуючи VPC Peering, можна додати групу безпеки, пов’язану з одноранговим VPC.

Ви можете надати додатковий опис для щойно доданого IP-адреси або діапазону CIDR. Клацніть Додати IP-адресу, щоб додати адресу до списку.


1

Ви можете видалити прапор {useUnifiedTopology: true} та встановити знову мангусту залежність ! це працювало для мене.


вона видає таку помилку, коли {useUnifiedTopology: true} видалено: (вузол: 10020) DeprecationWarning: поточний механізм виявлення та моніторингу сервера застарілий і буде видалений у наступній версії. Щоб використовувати новий двигун виявлення та моніторингу сервера, передайте параметр {useUnifiedTopology: true} конструктору MongoClient.
Арвінд

1

Я отримав таку ж помилку. Це кроки, які я дотримувався для її вирішення

  1. Перейдіть на вкладку безпеки -> Доступ до мережі -> Потім виберіть список вашого IP-адреси
  2. Потім перейдіть на вкладку безпеки -> Доступ до бази даних -> та видаліть свого поточного користувача.
  3. Створіть нового користувача, вказавши нове ім’я користувача та пароль.
  4. Вкажіть, що новостворене ім’я користувача та пароль у файлі .env або методі mongoose.connect

Після цих кроків воно працювало як завжди. сподіваюся, це допоможе вам, хлопці.


0

Ви можете спробувати:

// 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, якщо ви зареєстровані на сайті mongo? Ви вибрали версію node 3.00 or laterі скопіювали `` mongodb + srv: // user: <password> @ cluster0-3zrv8.mongodb.net / test? RetryWrites = true & w = більшість ''? Там у вас є три варіанти на вибір, виберіть середній вузол
Umbro

Я вибрав вузол "Підключити свою програму" і скопіював вищезазначений рядок з'єднання, замінивши пароль, однак я не впевнений, яким він повинен бути, пароль, за допомогою якого я ввійшов у atlast MongoDB чи щось інше? Я намагаюся з’ясувати
Арвінд

@ArvindKrmar ви надали окремий пароль бази даних
Umbro

Я створив двох користувачів у розділі "Доступ до бази даних" і зберігав той самий пароль, що і раніше, коли я входив у mongoDB, щоб захистити його ради або дозволити запуску програми, але поки не пощастило.
Арвінд

1
Код працює, коли я використовую localhost "mongodb: //127.0.0.1/FullStack". Так що, безумовно, пов'язаність з атласом MongoDB має певні проблеми.
Арвінд

0

У мене була ця проблема, для мене рішенням було перевірити, чи правильно налаштовано ip і перед підтвердженням на цьому екрані

введіть тут опис зображення


1
Я знайшов рішення. Проблема була в налаштуваннях брандмауера в моїй мережевій системі. portquiz.net:27017 можна використовувати для перевірки, чи з'єднання проходить. Хоча я не змінив брандмауер, оскільки цим керують мережеві адміністратори в моєму кінці, але одного разу брандмауер виправив свою роботу зараз. Дякую всім за пропозиції.
Арвінд

0

Будь ласка, перевірте свій пароль, ім’я користувача чи конфігурацію IP . Переважно "Вибір сервера вичерпано після 30000 мс у Timeout._onTimeout" відбувається завжди, коли ваші вищезгадані речі не узгоджуються з налаштуваннями вашого сервера.


це була проблема брандмауера в моєму кінці. Я виправив це і зараз його працює
Арвінд Крмар

0

Я в змозі вирішити питання. Все було добре, але брандмауер блокував доступ до порту 27017. Підключення можна перевірити на http://portquiz.net:27017/ або використовувати telnet до кінцевої точки, яку можна отримати з кластерів-> Метрики.

Дякую всім за пропозиції


0

Спробуйте зробити нового користувача в доступі до бази даних за допомогою методу аутентифікації за замовчуванням, який є "SCRAM". Потім зробіть для цього новий Кластер. Це працювало для мене! Мій файл 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: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

Яка ваша версія мангуста? тому що існує проблема з певною версією мангуста. Будь ласка, перейдіть за цим посиланням для отримання більш детальної інформації " https://github.com/Automattic/mongoose/isissue/8180 ". У всякому разі, я стикався з тим же питанням, але після використання старішої версії (5.5.2) це працювало для мене. Спробуйте, дайте мені знати, що сталося.


Я зіткнувся з тією ж проблемою, однак, я часто розвиваюсь із включеним і вимкненим VPN. Увімкнувши свій VPN знову, мені вдалося підключитися до БД. Я сподіваюся, що це питання є тимчасовим, тому що я не завжди можу ввімкнути свою VPN.
Майк К

0

В основному це може бути через оновлення npm. Я щойно оновив до npm v 6.13.7. і я почав отримувати цю помилку.

Виконуючи вказівки від @Matheus, я прокоментував рядок "{useUnifiedTopology: true}" і мені вдалося пройти його.

Я оновив мангусту і все працює добре.


0

Чи використовуєте ви будь-який антивірус, брандмауер, VPN або в обмеженій мережі (наприклад, робоче / комерційне підключення Wi-Fi / LAN)? Потім спробуйте вимкнути / підключити знову до іншої мережі. Деякі IP-адреси / з'єднання можуть бути заблоковані адміністратором мережі, яку ви використовуєте, або просто антивірус може мати правила брандмауера. Незважаючи на те, що якщо у вас є 0.0.0.0в IP AddressAtgo MongoDB.


0

У мене було те саме питання. Я міг підключитися з MongoDB Compass або мого додатка Node за допомогою рядків підключення, які мені надав Atlas. Я вирішив це, додавши свою IP-адресу в Білий список в Атласі.


0

Для всіх, хто все ще бореться за це питання. Я вирішив цю проблему, встановивши всі параметри, такі як ім'я користувача, пароль та dbName в самих параметрах мангуста.

Раніше код був таким. (Коли я отримував помилку).

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

Зауважте, що URL в монго з'єднатися. mongodb://${dbAddress}:${dbPort}/${dbName}.

Новий код без помилок.

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

Зверніть увагу на параметри та URL.

Це моє місцеве оточення. Не виробниче оточення

Сподіваюся, це буде корисним.


0

спробуйте вказати драйвер вузла, версія 2,2,12 у кластері -> connect -> підключити свою програму. нова рядок має бути з mongodb: //. використовувати цей рядок для підключення. не забудьте ввести пароль

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.