Próbuję połączyć się z bazą danych MongoDB przy użyciu nazwy użytkownika i hasła przy użyciu Mongoose w Node.js. Wszystkie dokumenty mówią, że parametry połączenia powinny wyglądać jak
mongodb://username:password@host:port/db
Jednak hasło zawiera znak „@”. Jak mogę zrobić z tego ciąg połączenia, który zrozumie mangusta? Czy mogę uniknąć znaku „@” w haśle, czy jest inna metoda połączenia, której muszę użyć?
@
w haśle musi być zakodowany w adresie URL. Zakodowany@
znak to%40
. Jednak%
znak również musi zostać zakodowany. Tak więc, jeśli twoje hasło to, powiedzmy,p@ss
końcowe zakodowane hasło powinno byćp%2540ss
Odpowiedzi:
Użyj tej składni:
mongoClient.connect("mongodb://username:p%40ssword@host:port/dbname?authSource=admin", { useNewUrlParser: true }, function(err, db) { } );
źródło
{uri_decode_auth: true}
na pierwszy rzut oka, ale zadziałało, gdy to zauważyłem. Dzięki.{uri_decode_auth: true}
powinno być przekazywane jako oddzielny obiekt, jeśli jesteś w NodeJS i używasz natywnego sterownika mongoDB.Jeśli Twoje hasło zawiera znaki specjalne:
const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;
źródło
Użyj
options
parametrumongoose.connect
wywołania, aby określić hasło zamiast umieszczać je w ciągu adresu URL:mongoose.connect('mongodb://localhost/test', {user: 'username', pass: 'p@ssword'}, callback);
źródło
Wypróbuj ten, moi przyjaciele:
mongoose.connect("mongodb://localhost:27017/test?authSource=admin", {user: 'viettd', pass: 'abc@123'});
test
to moja nazwa bazy danychadmin
to moja baza danych do uwierzytelnieniaviettd
moja nazwa użytkownikaabc@123
to moje hasłoźródło
użyj pwd zamiast pass, który działał dla mnie w wersji 3.2
mongoose.connect('mongodb://localhost/test', {user: 'username', pwd: 'p@ssword'}, callback);
źródło
Miałem również do czynienia z tym samym problemem. Rozwiązałem, dodając zakodowane hasło do parametrów połączenia. I działa po prostu dobrze.
(1) Zakoduj swoje hasło z https://www.url-encode-decode.com
(2) Zastąp swoje hasło zakodowanym.
(3) Powinno działać dobrze.
Na przykład:
Rzeczywiste hasło: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X
Zakodowane hasło: ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X
mongodb: // user1: ABCDEX%24KprpvDzRTy%60%40drf.%27%[email protected]: 1234, ds1234-test.com: 19889 / mongo-dev? replicaSet = rs-ds123546978 & ssl = true ',
źródło
encodeURIComponent()
a wbudowana funkcja może wykonać to zadanie.Jeśli używasz natywnego sterownika Mongodb Node.js, to działa u mnie od wersji sterownika 3.1. Załóżmy, że Twój adres URL nie zawiera informacji o uwierzytelnianiu.
MongoClient = require('mongodb').MongoClient; let options = { useNewUrlParser: true, auth: { user: 'your_usr', password: 'your_pwd' } }; MongoClient.connect(url, options, callback);
Lub jeśli chcesz dołączyć informacje o uwierzytelnianiu do swojego adresu URL, zrób to:
let url = "mongodb://username:" + encodeURIComponent("p@ssword") + "@localhost:27017/database"
źródło
Żadne z powyższych rozwiązań nie zadziałało. Zbadałem to dalej i odkryłem, że muszę uwzględnić parametr useNewUrlParser.
mongoose.connect(db, { useNewUrlParser : true }, err => { if (err){ console.error('Error: ' + err) } else{ console.log('Connected to MongoDb') } })
Z tego, co rozumiem, potrzebujesz określonej wersji MongoDB, aby z tego skorzystać. Aby uzyskać więcej informacji, zapoznaj się z ostrzeżeniem „Unikaj obecnego parsera ciągu URL jest przestarzałe”, ustawiając właściwość useNewUrlParser na wartość true
Ma to na celu pozbycie się ostrzeżenia, ale wyraźnie wersja wpływa również na wymagany parametr.
Nie testowałem wszystkich znaków specjalnych, ale na pewno działa z „@ # $”.
Mam nadzieję że to pomoże.
źródło
czasami trzeba połączyć się z bazą danych za pomocą innych narzędzi, które akceptują ciąg tylko jako parametry połączenia. więc po prostu zmień znak @ za pomocą% 40
źródło
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` );
źródło
To rozwiązanie wymaga dodatkowej zależności, ale to w końcu zadziałało.
Dodaj
mongodb-uri
do projektu i następujące wiersze do kodu:const mongoose = require('mongoose') const mongodbUri = require('mongodb-uri') let mongooseUri = mongodbUri.formatMongoose(config.mongo.uri) mongoose.connect(mongooseUri, config.mongo.options)
Znalazłem tę sugestię w
mongoose
numerze 6044 GitHub .źródło
Dla tych, którzy łączą się z Mongo Compass. ( MacOSx ) Po prostu przejdź do swojego klastra -> Bezpieczeństwo (karta) na mongodb.com
Następnie
edytuj swoje hasło (naciśnij przycisk edycji na swojej nazwie użytkownika):
Otrzymasz modalne / wyskakujące okienko / okno dialogowe: Naciśnij edytuj hasło pod swoim imieniem (przycisk jest domyślnie wyszarzony, ale pojawia się tuż pod twoim imieniem) -> Następnie naciśnij Aktualizuj użytkownika
Kolejny :
Zamknij aplikację mongo db compass, jeśli jest uruchomiona: (Quit Mongo)
Następny krok:
Wróć do zakładki Overview w mongodb.com. I wybierz Connect
Wróć do OverView:
Następny krok:
W wyskakującym oknie dialogowym wybierz Połącz z MongoDB Compass, a następnie w następnym widoku wybierz wersję, której chcesz użyć (najlepiej numer wersji wcześniej ):
Następnie:
Skopiować URI String przedstawione Ciebie:
Ponownie otwórz aplikację MongoDB Compass:
I da ci opcję / wyskakujące okienko, aby użyć wykrytego ciągu URI: Kliknij Tak
Ostatni krok:
Wprowadź nowe hasło i Połącz . Teraz twoje połączenie powinno się udać.
źródło
Użyj tego,
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true}).then(()=>console.log("DB connected"));
źródło
Jeśli nazwa użytkownika lub hasło zawiera znak at @, dwukropek:, ukośnik / lub znak procentu%, użyj kodowania procent .
Mongo Docs: https://docs.mongodb.com/manual/reference/connection-string/
źródło
Próbowałem tego w Pythonie i miałem podobny błąd. To zadziałało dla mnie.
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 reprezentuje twoje hasło i zakłada, że ma specjalny znak (np. @ - reprezentowany przez% 40) - nazwa użytkownika to twoja nazwa użytkownika mongodb, ip - twój adres ip, a sample_db baza danych pod mongodb, z którą chcesz się połączyć.
źródło
Ten pracował dla mnie
To jest aktualizacja MongoDB 2020 Jeśli używasz osobnego pliku env, po prostu dodaj swój
mongoose.connect('url', { useNewUrlParser: true, useUnifiedTopology: true });
źródło