Не удалось подключиться к кластеру MongoDB через NodeJS

Проблема, с которой я столкнулся

Я работаю над проектом веб-сервисов ExpressJS. Мы создали бесплатный кластер в MongoDB Atlas, и я пытаюсь подключиться к БД, используя строку подключения, предоставленную самим веб-сайтом. Я внес свой IP-адрес в белый список и сделал его доступным откуда угодно, но пока ничего не помогло. Я думаю, что с моим кодом все в порядке, поскольку я смог подключиться к базе данных localhost. Но я все равно упоминаю об этом ниже для лучшего обзора.

Код:

const express = require('express');
const bodyParser = require('body-parser')
const cors = require('cors')
const mongoose = require('mongoose');

const app = express();
const port = 8000;

// Encode username and password for mongodb as URI encoded component
const username = encodeURIComponent("<username>");
const password = encodeURIComponent("<password>")

// const mongoDbUrl = `mongodb://${username}:${password}@host:port/database`;
// const mongoDbUrl = `mongodb://${username}:${password}@diversity-of-living-clu.hqwcott.mongodb.net`;
const mongoDbUrl = "mongodb://<username>:<password>@diversity-of-living-clu.hqwcott.mongodb.net/"

// mongodb://<username>:<password>@diversity-of-living-clu.hqwcott.mongodb.net/3380DiversityOfLiving-data?retryWrites=true&w=majority&appName=diversity-of-living-cluster
// Initialising options for cors
const corsOptions = {
    origin: "*",
    credentials: true
}

app.use(bodyParser.json());
app.use(cors(corsOptions));

// Routers
const numbeoRouter = require('./DiversityOfLiving-Routers/NumbeoRouterAra65');
const userRouter = require('./DiversityOfLiving-Routers/UserRouterJpa72');
const faqRouter = require('./DiversityOfLiving-Routers/FAQRouterJpa72');
const countryCountRouter = require('./DiversityOfLiving-Routers/CountryCountRouterJpa72');
const countryDataRouter = require('./DiversityOfLiving-Routers/CountryDataRouterAra65');

// Using Routers
app.use('/numbeo', numbeoRouter);
app.use('/faq', faqRouter);
app.use('/countrycount', countryCountRouter);
app.use('/user', userRouter);
app.use('/countrydata', countryDataRouter);

app.listen(port, function () {
    console.info('Express server listening on: http://localhost:' + port);
    mongoose.connect(mongoDbUrl, { useNewUrlParser: true, useUnifiedTopology: true, connectTimeoutMS: 10000 })
    .then(() => {console.info("Connected to MongoDB");})
    .catch((err) => {console.info("Error connecting to MongoDB:", err.message, err.stack);})
});

Решения, которые я пробовал:

  • URL-адреса как SRV, так и не-SRV
  • Внес мой IP-адрес в белый список и сделал его доступным откуда угодно.

Ниже приведена ошибка, которую я получаю:

Error connecting to MongoDB: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/ MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/

Но я не думаю, что это проблема, поскольку мне удалось подключиться к кластеру с помощью расширения MongoDB Compass, Mongosh и VS Code MongoDB.

Открыт для любых обзоров кода, а также для опробования новых решений. Спасибо!

Если вы используете mongodb+srv:// вместо mongodb://, драйвер сможет найти DNS-хост вашего кластера Atlas. Кроме того, на бесплатных уровнях ваш кластер приостанавливается из-за неактивности, поэтому убедитесь, что этого не произошло. Почему вы используете encodeURIComponent, у вас в имени пользователя и пароле есть специальные символы? Параметры useNewUrlParser и useUnifiedTopology устарели, если вы используете mongoose версии 6+.

jQueeny 27.05.2024 11:06

Понимаю, это вызывает проблемы, потому что я использую старую версию Mongoose. Я обновил как пакет, так и URL-адрес. Он подключается к кластеру, но это был старый проект, и теперь мне придется изменить и другой код моего приложения.

Anurag Rawal 27.05.2024 11:41

Важно постоянно обновлять пакеты в вашем приложении, в первую очередь для исправлений безопасности, но, как вы узнали, также возникают проблемы совместимости. Удачи в обновлении.

jQueeny 27.05.2024 11:53

Это еще одно предупреждение (node:33066) [DEP0040] DeprecationWarning: The "punycode" module is deprecated. Please use a userland alternative instead.. Что может быть причиной этого?

Anurag Rawal 27.05.2024 13:20

Решено: я только что вручную обновил пакет «punycode».

Anurag Rawal 27.05.2024 13:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
120
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Решение включает два шага

  1. Обновление пакета mongoose вручную. У меня был старый пакет «Мангуст», который уже обесценился.
npm install mongoose@latest

ИЛИ (чтобы указать версию)

npm install [email protected]
  1. Использование mongodb+srv:// вместо mongodb:// в URL-адресе для подключения к кластеру MongoDB.

Я думаю, вам нужно изменить IP-адрес доступа к сети на 0.0.0.0/0 для вашего кластера MongoDB Atlas в разделе безопасности. Все должно работать нормально. Если нет, попробуйте подключить вашу систему к мобильной точке доступа. Иногда существуют сетевые барьеры, которые не позволяют серверу получить доступ к IP-адресу.

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

Wernfried Domscheit 27.05.2024 17:55

Я уже внес свой IP-адрес в белый список, я упомянул об этом в своем вопросе. Проблема решена, проблема была не в этом.

Anurag Rawal 28.05.2024 11:43

Другие вопросы по теме