Ошибка подключения 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 (internal / timers.js: 475: 7) {name: 'MongoTimeoutError', причина: ошибка: подключить ETIMEDOUT 99.80.11.208:27017 в TCPConnectWrap.afterConnect [as oncomplete] (нетто). js: 1128: 14) {name: 'MongoNetworkError', [Symbol (mongoErrorContextSymbol)]: {}}, [Symbol (mongoErrorContextSymbol)]: {}} (узел: 42892) UnhandledPromiseRejectionWarning: MongoTimeoutError после ошибки 300 мс: выбор сервера 300 at Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) в listOnTimeout (internal / timers.js: 531: 17) в processTimers (internal / 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, но оно выдало ту же ошибку. Может ли быть какие-то настройки у atLas Mongodb?
Арвинд Крмар
2
приложение хорошо работает с локальной MongoDB "mongodb: //127.0.0.1/FullStack". Появляется подключение к атласу MongoDB это проблема.
Арвинд Крмар
1
Я могу решить это. Брандмауэр блокировал доступ, то же самое можно было проверить с помощью: portquiz.net:27017
Арвинд Крмар,

Ответы:

25

просто перейдите в админ-панель mongodb atlas. Перейдите на вкладку «Безопасность»> «Доступ к сети» и добавьте его в белый список.

Смотрите это изображение, чтобы найти конкретное меню

Примечание: проверьте свой IP на Google, а затем добавьте его

кунал усапкар
источник
2
Сделал это, но не повезло. Скорее я разрешил все IP-адреса, все еще не работал
Арвинд Крмар
братан, ты правильно настроил конфигурацию БД
кунал usapkar
Я создал роли для доступа к базе данных: имя пользователя: arvind Метод аутентификации: SCRAM MongoDBRoles: atlasAdmin @ admin Нужно ли создавать что-то в кластере или в «озере данных»?
Арвинд Крмар
удалось решить, все было правильно, но брандмауэр блокировал доступ к порту 27017, то же самое можно проверить здесь: portquiz.net:27017
Арвинд Крмар,
хорошо, большое счастливое кодирование
кунал usapkar
6

Убедитесь, что "<" и ">" удалены при замене полей пользователя и пароля. Это сработало для меня

Smartniggs
источник
3

Иногда эта ошибка возникает из-за IP-адреса, предоставленного доступа к нашей базе данных.

Имейте в виду, ваше приложение может работать хорошо, а затем возникнет такая ошибка. Каждый раз, когда это происходит, в большинстве случаев ваши IP-адреса меняются, что не разрешено в белом списке адресов.

Все, что вам нужно сделать, это обновить белый список с вашими текущими IP-адресами

Одубола Олуватимилехин
источник
2

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

НОТА

Вы можете пропустить этот шаг, если Atlas указывает на шаге Настройка безопасности подключения, что вы уже настроили запись белого списка в своем кластере. Чтобы управлять белым списком IP-адресов, см. Добавление записей в белый список.

Если белый список пуст, Atlas предложит вам добавить IP-адрес в белый список проекта. Вы также можете:

Нажмите «Добавить свой текущий IP-адрес», чтобы добавить в белый список ваш текущий IP-адрес.

Нажмите Добавить другой IP-адрес, чтобы добавить один IP-адрес или диапазон адресов, помеченный CIDR.

Для кластеров Atlas, развернутых в Amazon Web Services (AWS) и использующих пиринг VPC, можно добавить группу безопасности, связанную с равноправным VPC.

Вы можете предоставить дополнительное описание для вновь добавленного IP-адреса или диапазона CIDR. Нажмите Добавить IP-адрес, чтобы добавить адрес в белый список.

Kushal
источник
1

Вы можете удалить флаг {useUnifiedTopology: true} и переустановить зависимость от mongoose! это сработало для меня.

Матеус
источник
выдает следующую ошибку, когда {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);
});
Umbro
источник
@ArvindKrmar, если вы вошли на сайт Монго? Вы выбрали версию node 3.00 or laterи скопировали `mongodb + srv: // пользователь: <пароль> @ 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», когда указанные выше вещи не соответствуют конфигурации вашего сервера.

Vaibhav
источник
это была проблема с брандмауэром с моей стороны. Я исправил это и теперь оно работает
Арвинд Крмар
0

Я могу решить проблему. Все было хорошо, но брандмауэр блокировал доступ к порту 27017. Подключение можно проверить по адресу http://portquiz.net:27017/ или с помощью telnet до конечной точки, которую можно получить из кластеров-> Метрики.

Спасибо всем за предложения

Арвинд Крмар
источник
0

Попробуйте создать нового пользователя в базе данных Access с методом аутентификации по умолчанию, который называется «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/issues/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 AddressАтласе MongoDB.

Даниил Даниелецкий
источник
0

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

rekwet
источник
0

Для всех, кто все еще борется с этим вопросом. Я решил эту проблему, установив все параметры, такие как имя пользователя, пароль и dbName, в опциях mongoose.

Ранее код был таким. (Когда я получал ошибку).

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 в кластере -> подключиться -> подключить ваше приложение. новая строка должна быть с mongodb: //. используйте эту строку для подключения. не забудьте ввести пароль

dkovskij
источник