Пароль MongoDB с "@" в нем

Я пытаюсь подключиться к базе данных MongoDB с помощью имени пользователя и пароля, используя Mongoose в Node.js. Все документы говорят, что строка подключения должна выглядеть так

  mongodb://username:password@host:port/db

Однако пароль содержит символ "@". Как я могу сделать строку подключения из этого, что мангуст поймет? Могу ли я избежать "@" в пароле или есть другой способ подключения, который я должен использовать?

18 ответов

Используйте этот синтаксис, не забывайте uri_decode_auth вариант.

mongoClient.connect("mongodb://username:p%40ssword@host:port/dbname", { 
    uri_decode_auth: true 
    }, function(err, db) {

    }
);

Если ваш пароль содержит специальные символы:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;

Использовать options параметр mongoose.connect вызовите, чтобы указать пароль, а не включать его в строку URL:

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pass: 'p@ssword'},
                 callback);

Попробуйте это, друзья мои:

    mongoose.connect("mongodb://localhost:27017/test?authSource=admin",
                     {user: 'viettd', pass: 'abc@123'});

test мое имя БД
admin мой БД для аутентификации
viettd мое имя пользователя
abc@123 мой пароль

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

(1) Кодируйте свой пароль с https://www.url-encode-decode.com/
(2) Замените ваш пароль на зашифрованный.
(3) Это должно работать хорошо.

Например:
Фактический пароль: ABCDEX$KrrpvDzRTy`@drf.';3X
Кодированный пароль: ABCDEX%24KrrpvDzRTy%60%40drf.%27%3B3X

MongoDB://user1:ABCDEX%24KprpvDzRTy%60%40drf.%27%3B3X@dstest.com:1234,ds1234-test.com:19889/ Монго-DEV replicaSet= RS-ds123546978& = SSL правда",

Используйте pwd вместо pass, у меня сработало для версии 3.2

mongoose.connect('mongodb://localhost/test',
                 {user: 'username', pwd: 'p@ssword'},
                 callback);

Если вы используете собственный драйвер Mongodb Node.js, это то, что мне подходит для версии драйвера 3.1. Предположим, что ваш URL не содержит информацию об аутентификации.

MongoClient = require('mongodb').MongoClient;
let options = {
    useNewUrlParser: true,
    auth: {
        user: 'your_usr',
        password: 'your_pwd'
    }
};
MongoClient.connect(url, options, callback);

Или, если вы хотите включить информацию об аутентификации в ваш URL, сделайте это:

let url = "mongodb://username:" + encodeURIComponent("p@ssword") + "@localhost:27017/database"

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

mongoose.connect(db, {
    useNewUrlParser : true
    },
    err => {
    if (err){
        console.error('Error: ' + err)
    }
    else{
        console.log('Connected to MongoDb')
    }
})

Из того, что я понимаю, вам нужна конкретная версия MongoDB, чтобы использовать это. Для получения более подробной информации, установите флажок "Предупреждение о том, что текущий анализатор строк URL устарел", установив для useNewUrlParser значение true

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

Я не проверял все специальные символы, но он определенно работает с '@#$'.

Надеюсь это поможет.

Also, if your password contains a percentage, %, 
 Because the percent ("%") character serves as the indicator for percent-encoded octets, it must be percent-encoded as "%25" for that octet to be used as data within a URI

for example, if your password is John%Doe, the new transformed password will be John%25Doe or
If password is Paul%20Wait, New Password will be Paul%2520Wait

mongoClient.connect("mongodb://username:John%25Doe@host:port/dbname", function(err, db) {
// password is John%Doe
    }`enter code here`
);

Иногда вам нужно подключиться к БД, используя другие инструменты, которые принимают строку только как строку подключения. так что просто поменяйте знак @ на%40

Для тех, кто подключается с Mongo Compass. (MacOSx) Просто перейдите в ваш кластер -> Безопасность (вкладка) на mongodb.com

затем

измените свой пароль (нажмите кнопку редактирования на вашем имени пользователя):

Вы получите модальное / всплывающее окно / диалоговое окно: нажмите "Изменить пароль" под вашим именем (по умолчанию кнопка неактивна, но отображается под вашим именем)-> Затем нажмите " Обновить пользователя".

Далее:

Закройте приложение mongo db compass, если оно запущено:(Выход из Mongo)

Следующий шаг:

Вернитесь на вкладку "Обзор" на сайте mongodb.com и выберите " Подключиться".

Вернуться в OverView:

Следующий шаг:

Во всплывающем диалоговом окне выберите " Подключиться к MongoDB Compass", затем в следующем представлении выберите версию, которую вы хотите использовать (предпочтительно, " VersionNumber ранее"):

Затем:

Скопируйте представленную вам строку URI:

Откройте приложение MongoDB Compass:

И это даст вам возможность / всплывающее окно для использования обнаруженной строки URI: Нажмите Да

Заключительный этап:

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

Это решение требует дополнительной зависимости, но это было то, что в итоге сработало для меня.

добавлять mongodb-uri к вашему проекту и следующие строки к вашему коду:

const mongoose = require('mongoose')
const mongodbUri = require('mongodb-uri')
let mongooseUri = mongodbUri.formatMongoose(config.mongo.uri)
mongoose.connect(mongooseUri, config.mongo.options)

Я нашел это предложение в mongooseGitHub выпуск № 6044.

Я пытался это сделать на Python, и у меня была аналогичная ошибка. Это сработало для меня.

import pymongo

client = pymongo.MongoClient("mongodb://username:12%40password@ip:27017/sample_db") 
db = client.sample_db
# print the number of documents in a collection
print(db.collection.count())

12%40password представляет ваш пароль и предполагает, что он имеет специальный символ (например, @ - представлен%40) - username - это ваше имя пользователя mongodb, ip - ваш IP-адрес и sample_db - база данных в mongodb, к которой вы хотите подключиться.

Использовать это,

mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true}).then(()=>console.log("DB connected"));

Если имя пользователя или пароль включает знак @, двоеточие:, косую черту / или знак процента%, используйте процентное кодирование.

Документы Mongo:https://docs.mongodb.com/manual/reference/connection-string/

По-видимому, я столкнулся с чем-то похожим, но я не смог найти другого пути, кроме как избегать использования специальных символов в пароле. Я пробовал другие специальные символы (^% &), ни один из них не работает с паролем в строке URL. Но в документе MongoDB говорится только

      : / ? # [ ] @

эти символы должны быть закодированы в процентах.

Я пробовал кодировать большинство из них в своих комбинациях паролей, но ни один из них не работает.

Это сработало для меня

Это обновление MongoDB 2020. Если вы используете отдельный файл env, просто добавьте свой

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});

Чтобы подключиться к базе данных MongoDB и избежать проблем со специальными символами, такими как «@», в вашем пароле, у вас есть несколько вариантов:

  1. Измените свой пароль. Самый простой способ — изменить пароль MongoDB на тот, который не содержит специальных символов. Это поможет вам избежать осложнений в строке подключения.

  2. encodeURIComponent: если вам нужно сохранить в пароле специальные символы, вы можете использоватьencodeURIComponentфункция в JavaScript для кодирования вашего пароля. Вот как вы можете использовать его в строке подключения:

            const username = 'your_username';
    const password = 'your@password'; // Note the special character "@" in the password
    const encodedPassword = encodeURIComponent(password);
    
    const connectionString = `mongodb://${username}:${encodedPassword}@your-mongodb-host:27017/your-database`;
    
Другие вопросы по тегам