Estou tentando me conectar a um banco de dados MongoDB com um nome de usuário e senha usando Mongoose em Node.js. Todos os documentos dizem que a string de conexão deve ser semelhante a
mongodb://username:password@host:port/db
No entanto, a senha contém o caractere '@'. Como posso fazer uma string de conexão que o mangusto entenda? Posso escapar do '@' na senha ou há outro método de conexão que devo usar?
@
em sua senha precisa ser codificado no URL. O@
caractere codificado é%40
. No entanto, o%
caractere também precisa ser codificado. Então, se sua senha for, digamos,p@ss
a senha codificada final deve serp%2540ss
Respostas:
Use esta sintaxe:
mongoClient.connect("mongodb://username:p%40ssword@host:port/dbname?authSource=admin", { useNewUrlParser: true }, function(err, db) { } );
fonte
{uri_decode_auth: true}
primeiro olhar, mas funcionou assim que percebi isso. Obrigado.{uri_decode_auth: true}
deve ser passado como um objeto separado se você estiver no NodeJS e usando o driver nativo do mongoDB.Se sua senha tiver caracteres especiais:
const dbUrl = `mongodb://adminUsername:${encodeURIComponent('adminPassword')}@localhost:27017/mydb`;
fonte
Use o
options
parâmetro damongoose.connect
chamada para especificar a senha em vez de incluí-la na string do URL:mongoose.connect('mongodb://localhost/test', {user: 'username', pass: 'p@ssword'}, callback);
fonte
Experimente este, meus amigos:
mongoose.connect("mongodb://localhost:27017/test?authSource=admin", {user: 'viettd', pass: 'abc@123'});
test
é meu nome de banco de dadosadmin
é meu o banco de dados para autenticaçãoviettd
é meu nome de usuárioabc@123
é minha senhafonte
use pwd em vez de passar, que funcionou para mim na versão 3.2
mongoose.connect('mongodb://localhost/test', {user: 'username', pwd: 'p@ssword'}, callback);
fonte
Eu também enfrentei o mesmo problema. Resolvi adicionando uma senha codificada na string de conexão. E funciona muito bem.
(1) Codifique sua senha em https://www.url-encode-decode.com
(2) Substitua sua senha por uma codificada.
(3) Deve funcionar bem.
Por exemplo:
Senha real: ABCDEX $ KrrpvDzRTy` @ drf. '; 3X
Senha codificada: 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 ',
fonte
encodeURIComponent()
é a função integrada que pode fazer o trabalho.Se você usa o driver Node.js nativo Mongodb, é isso que funciona para mim a partir da versão 3.1 do driver. Suponha que seu url não contenha informações de autenticação.
MongoClient = require('mongodb').MongoClient; let options = { useNewUrlParser: true, auth: { user: 'your_usr', password: 'your_pwd' } }; MongoClient.connect(url, options, callback);
Ou se você quiser incluir informações de autenticação em seu url, faça o seguinte:
let url = "mongodb://username:" + encodeURIComponent("p@ssword") + "@localhost:27017/database"
fonte
Nenhuma das soluções mencionadas acima funcionou para mim. Pesquisei mais e descobri que precisava incluir o parâmetro useNewUrlParser.
mongoose.connect(db, { useNewUrlParser : true }, err => { if (err){ console.error('Error: ' + err) } else{ console.log('Connected to MongoDb') } })
Pelo que entendi, você precisa de uma versão específica do MongoDB para usar isso. Para mais detalhes, verifique aviso Evitar “o analisador de string de URL atual está obsoleto” definindo useNewUrlParser como verdadeiro
É para se livrar do aviso, mas claramente a versão também afeta o parâmetro necessário.
Não testei todos os caracteres especiais, mas definitivamente funciona com '@ # $'.
Espero que isto ajude.
fonte
às vezes você precisa se conectar ao banco de dados usando outras ferramentas que aceitam string apenas como string de conexão. então apenas altere o sinal @ com% 40
fonte
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` );
fonte
Esta solução requer uma dependência extra, mas foi o que finalmente funcionou para mim.
Adicione
mongodb-uri
ao seu projeto e as seguintes linhas ao seu código:const mongoose = require('mongoose') const mongodbUri = require('mongodb-uri') let mongooseUri = mongodbUri.formatMongoose(config.mongo.uri) mongoose.connect(mongooseUri, config.mongo.options)
Encontrei essa sugestão na
mongoose
edição # 6044 do GitHub .fonte
Para aqueles que se conectam com Mongo Compass. ( MacOSx ) Basta ir para seu cluster -> Segurança (Guia) em mongodb.com
Então
edite sua senha (pressione o botão editar em seu nome de usuário):
Você obterá um modal / pop-up / caixa de diálogo: Pressione editar senha abaixo do seu nome (o botão fica acinzentado por padrão, mas aparece logo abaixo do seu nome) -> Em seguida, pressione Atualizar usuário
Próximo :
Feche o aplicativo mongo db compass se estiver executando: (Saia do Mongo)
Próxima Etapa:
Retorne à guia Visão geral em mongodb.com.and selecione Conectar
Retornar para OverView:
Próxima Etapa:
Na caixa de diálogo pop-up, selecione Conectar com MongoDB Compass e, na próxima visualização, selecione uma versão que deseja usar (preferencialmente VersionNumber anterior ):
Então:
Copie a string URI apresentada a você:
Reabra o aplicativo MongoDB Compass:
E lhe dará a opção / pop-up para usar o URI String detectado: Clique em Sim
Passo final:
Digite sua nova senha e conecte-se . Agora, sua conexão deve ser bem-sucedida.
fonte
Usa isto,
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true}).then(()=>console.log("DB connected"));
fonte
Se o nome de usuário ou a senha incluir o símbolo de arroba @, dois pontos:, barra / ou o caractere% do sinal de porcentagem, use a codificação de porcentagem .
Mongo Docs: https://docs.mongodb.com/manual/reference/connection-string/
fonte
Eu estava tentando fazer isso em python e tive um erro semelhante. Isso funcionou para mim.
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 representa sua senha e assume que ela tem um caractere especial (por exemplo, @ - representado por% 40) - username é seu nome de usuário mongodb, ip - seu endereço IP e sample_db o banco de dados sob mongodb ao qual você deseja se conectar.
fonte
Este funcionou para mim
Este é uma atualização do MongoDB 2020. Se você estiver usando um arquivo env separado, basta adicionar seu
mongoose.connect('url', { useNewUrlParser: true, useUnifiedTopology: true });
fonte