0

MongoParseError: URI отсутствует имя хоста, доменное имя и TLD

16

Я получаю следующую ошибку, когда пытаюсь подключить свое приложение (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 ответ(ов)

1

Убедитесь, что специальные символы в вашем пароле закодированы. Например, если ваш пароль содержит символ '#', вы должны заменить его на код '%23', где 23 — это шестнадцатеричный код для '#'. Для получения дополнительной информации, пожалуйста, обратитесь к документации: https://docs.atlas.mongodb.com/troubleshoot-connection/#special-characters-in-connection-string-password.

0

Использование модификатора строки подключения +srv автоматически устанавливает параметр ssl в значение true для соединения. Вы можете переопределить это поведение, явно установив параметр ssl в значение false, добавив ssl=false в строку запроса.

Возможно, проблема связана с SSL? Попробуйте отключить SSL, добавив ssl=false.

0

При использовании символа # в пароле для подключения к 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, где это необходимо.

0

Эта ошибка возникает из-за того, что при использовании специальных символов в ваших паролях, таких как: / ? # [ ] @, могут возникнуть проблемы.

Чтобы решить эту проблему, вам нужно преобразовать ваш пароль в процентное кодирование. Для этого замените специальные символы следующим образом:

  • @ = %40 (замените @ на %40)
  • ? = %3F
  • # = %23
  • [ = %5B
  • ] = %5D

Если какой-то специальный символ не упомянут здесь, вы можете воспользоваться следующей ссылкой.

  1. Просто вставьте ваш пароль и получите процентное закодированное значение: https://www.w3schools.com/tags/ref_urlencode.ASP
0

Если имя пользователя или пароль содержат следующие символы:

: **/ ? # [ ] @**

то эти символы должны быть преобразованы с использованием кодирования процентов (percent encoding).

Вы можете выполнить это преобразование с помощью следующего сайта:

https://www.w3schools.com/tags/ref_urlencode.ASP

Я заметил, что ваш пароль MONGO_URI содержит символ #, который нужно закодировать в %23.

Пример кода будет выглядеть так:

module.exports = {
    uri: "mongodb+srv://mithun:m3Thun%23@cluster.mongodb.net/test?retryWrites=true&ssl=false"
}

Обратите внимание, что символ # в пароле теперь заменен на %23.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь