MongoParseError: URI отсутствует имя хоста, доменное имя и TLD
Я получаю следующую ошибку, когда пытаюсь подключить свое приложение (Node.js) к MongoDB. Буду признателен за вашу помощь!
MongoParseError: URI does not have hostname, domain name and tld
at parseSrvConnectionString (E:\Projects\NodeAPI\node_modules\mongodb-core\lib\uri_parser.js:41:21)
at parseConnectionString (E:\Projects\NodeAPI\node_modules\mongodb-core\lib\uri_parser.js:509:12)
at connect (E:\Projects\NodeAPI\node_modules\mongodb\lib\operations\mongo_client_ops.js:195:3)
at connectOp (E:\Projects\NodeAPI\node_modules\mongodb\lib\operations\mongo_client_ops.js:284:3)
at executeOperation (E:\Projects\NodeAPI\node_modules\mongodb\lib\utils.js:416:24)
at MongoClient.connect (E:\Projects\NodeAPI\node_modules\mongodb\lib\mongo_client.js:175:10)
at Function.MongoClient.connect (E:\Projects\NodeAPI\node_modules\mongodb\lib\mongo_client.js:341:22)
at Object.<anonymous> (E:\Projects\NodeAPI\server.js:12:13)
at Module._compile (internal/modules/cjs/loader.js:816:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:827:10)
name: 'MongoParseError',
[Symbol(mongoErrorContextSymbol)]: {}
Вот мой код:
db.js
module.exports = {
uri: "mongodb+srv://mithun:*******@cluster0-s089x.mongodb.net/test?retryWrites=true"
}
node_route.js
module.exports = function(app, db) {
app.post('/notes', (req, res) => {
const note = {text: req.body.body, title: req.body.title};
db.collection('notes').insert(note, (err, results) => {
if (err) {
res.send({'error': 'An error has occured'});
} else {
res.send(results.ops[0]);
}
});
});
};
index.js
const noteRoutes = require('./note_route');
module.exports = function(app, db) {
noteRoutes(app, db);
}
server.js
const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const db = require('./config/db');
const app = express();
const port = 8000;
app.use(bodyParser.urlencoded({extended: true}));
MongoClient.connect(db.uri, { useNewUrlParser: true }, (err, database) => {
if (err) return console.log(err);
require('./app/routes')(app, database);
app.listen(port, () => {
console.log("We are live on " + port);
});
});
Я пробовал установить ssl=false
, но ошибка осталась прежней. В чем может быть проблема?
5 ответ(ов)
Убедитесь, что специальные символы в вашем пароле закодированы. Например, если ваш пароль содержит символ '#', вы должны заменить его на код '%23', где 23 — это шестнадцатеричный код для '#'. Для получения дополнительной информации, пожалуйста, обратитесь к документации: https://docs.atlas.mongodb.com/troubleshoot-connection/#special-characters-in-connection-string-password.
Использование модификатора строки подключения +srv автоматически устанавливает параметр ssl в значение true для соединения. Вы можете переопределить это поведение, явно установив параметр ssl в значение false, добавив ssl=false
в строку запроса.
Возможно, проблема связана с SSL? Попробуйте отключить SSL, добавив ssl=false
.
При использовании символа #
в пароле для подключения к MongoDB, необходимо заменить его на символ %23
. Это связано с тем, что символ #
используется в URL для обозначения начала фрагмента, что может привести к ошибкам.
Ваш строка подключения может выглядеть следующим образом:
let mongoURI = "mongodb+srv://username:password%23@hostname/dbname?retryWrites=true&w=majority";
mongoose
.connect(mongoURI, { useNewUrlParser: true })
.then(() => console.log("MongoDB подключен"))
.catch((err) => console.log(err));
В данном коде используются username
, password%23
, hostname
и dbname
, которые должны быть заменены на ваши реальные значения. Убедитесь, что пароль правильно закодирован и заменены символы %23
, где это необходимо.
Эта ошибка возникает из-за того, что при использовании специальных символов в ваших паролях, таких как: / ? # [ ] @
, могут возникнуть проблемы.
Чтобы решить эту проблему, вам нужно преобразовать ваш пароль в процентное кодирование. Для этого замените специальные символы следующим образом:
@
=%40
(замените@
на%40
)?
=%3F
#
=%23
[
=%5B
]
=%5D
Если какой-то специальный символ не упомянут здесь, вы можете воспользоваться следующей ссылкой.
- Просто вставьте ваш пароль и получите процентное закодированное значение: https://www.w3schools.com/tags/ref_urlencode.ASP
Если имя пользователя или пароль содержат следующие символы:
: **/ ? # [ ] @**
то эти символы должны быть преобразованы с использованием кодирования процентов (percent encoding).
Вы можете выполнить это преобразование с помощью следующего сайта:
Я заметил, что ваш пароль MONGO_URI содержит символ #, который нужно закодировать в %23.
Пример кода будет выглядеть так:
module.exports = {
uri: "mongodb+srv://mithun:m3Thun%23@cluster.mongodb.net/test?retryWrites=true&ssl=false"
}
Обратите внимание, что символ # в пароле теперь заменен на %23.
Как вернуть результаты Mongoose из метода find?
Ошибка "npm WARN package.json: Нет поля repository"
Как получить параметры GET после "?" в Express?
Включение HTTPS в express.js
Express 4: Middleware для обработки ошибок не вызывается