Проблема, с которой я столкнулся
Я работаю над проектом веб-сервисов 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);})
});
Решения, которые я пробовал:
Ниже приведена ошибка, которую я получаю:
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.
Открыт для любых обзоров кода, а также для опробования новых решений. Спасибо!
Понимаю, это вызывает проблемы, потому что я использую старую версию Mongoose. Я обновил как пакет, так и URL-адрес. Он подключается к кластеру, но это был старый проект, и теперь мне придется изменить и другой код моего приложения.
Важно постоянно обновлять пакеты в вашем приложении, в первую очередь для исправлений безопасности, но, как вы узнали, также возникают проблемы совместимости. Удачи в обновлении.
Это еще одно предупреждение (node:33066) [DEP0040] DeprecationWarning: The "punycode" module is deprecated. Please use a userland alternative instead.. Что может быть причиной этого?
Решено: я только что вручную обновил пакет «punycode».





Решение включает два шага
npm install mongoose@latest
ИЛИ (чтобы указать версию)
npm install [email protected]
mongodb+srv:// вместо mongodb:// в URL-адресе для подключения к кластеру MongoDB.Я думаю, вам нужно изменить IP-адрес доступа к сети на
0.0.0.0/0
для вашего кластера MongoDB Atlas в разделе безопасности. Все должно работать нормально. Если нет, попробуйте подключить вашу систему к мобильной точке доступа. Иногда существуют сетевые барьеры, которые не позволяют серверу получить доступ к IP-адресу.
Вместо того, чтобы предоставлять доступ с любого IP, лучше предоставить доступ с IP, которые действительно необходимы.
Я уже внес свой IP-адрес в белый список, я упомянул об этом в своем вопросе. Проблема решена, проблема была не в этом.
Если вы используете
mongodb+srv://вместоmongodb://, драйвер сможет найти DNS-хост вашего кластера Atlas. Кроме того, на бесплатных уровнях ваш кластер приостанавливается из-за неактивности, поэтому убедитесь, что этого не произошло. Почему вы используетеencodeURIComponent, у вас в имени пользователя и пароле есть специальные символы? ПараметрыuseNewUrlParserиuseUnifiedTopologyустарели, если вы используете mongoose версии 6+.