MongoDB密码,其中带有“ @”


91

我正在尝试使用Node.js中的Mongoose使用用户名和密码连接到MongoDB数据库。所有文档都说连接字符串应该像

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

但是,密码中包含“ @”字符。我怎样才能用猫鼬会理解的连接字符串呢?我可以不使用密码中的“ @”,还是必须使用其他连接方法?


1
不,不起作用。给它们添加%40也不起作用。
iZ。

4
我建议将密码更改为不包含@字符的密码。
西尔文·德芬斯涅

1
用斜杠转义有效吗?“ \ @”?
DhruvPathak 2011年

1
@AmolMKulkarni:我知道这是猫鼬用来指定连接的格式。但是,OP想知道他如何使用包含“ @”的密码?该密码类似于“ p @ ssw0rd”(这是一个me脚的密码)。该URL将是“ monbgodb:// username:p @ ssw0rd @ host:port / db”,它被猫鼬误解了(即,它在第一个@而不是最后一个拆分)。
Sylvain Defresne,2013年

1
@密码中的字符需要在URL中编码。编码@字符为%40。但是,%字符也需要编码。因此,假设您的密码是,p@ss最终的编码密码应为p%2540ss
Michael Pacheco

Answers:


115

使用以下语法:

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

    }
);

6
这个答案应该会得到更多的爱,实际上只是将@符号转换为%40即可达到目的。
jonezy 2015年

4
{uri_decode_auth: true}乍一看,我很想念,但是一旦发现,它就起作用了。谢谢。
Mark Rendle

1
对于菜鸟来说,{uri_decode_auth: true}如果您在NodeJS中并使用mongoDB的本机驱动程序,则应将其作为单独的对象传递。
Koushik Shom Choudhury

5
从驱动程序版本3.1开始,不支持选项[uri_decode_auth]
toadead

它提供了不支持[uri_decode_auth]的选项,使用的是最新的猫鼬
Mohit Sehgal

38

如果您的密码有特殊字符:

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

这是应该得到更多爱的答案,因为它可以解决整个问题,而不仅仅是OP的非常特殊的用例。
spikyjt

29

使用调用的options参数mongoose.connect来指定密码,而不是将其包括在URL字符串中:

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

1
我喜欢这种方法,因为再键入一行不会对您造成伤害。
S. Patel

5

我的朋友们,试试这个吧:

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

test是我的数据库名称
admin是我的身份验证数据库
viettd是我的用户名
abc@123是我的密码


5

使用pwd而不是pass,它对version3.2有用

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

4

我也面临同样的问题。我已经解决了将编码后的密码添加到连接字符串中的问题。而且效果很好。

(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 / mongo-dev?replicaSet = rs-ds123546978&ssl = true',


1
不是最好的建议,建议将密码发送给不受信任的来源...
guyarad

正如@guyarad所说,您不应该公开数据库密码,并且如果您定期更改密码也不适合。之所以这样说,是因为您不需要其他软件/站点就能做到这一点,encodeURIComponent()它就是可以完成这项工作的内置功能。
27px

4

如果您使用Mongodb本机Node.js驱动程序,那么从3.1驱动程序版本开始,这对我来说就是有效的。假设您的网址不包含身份验证信息。

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

或者,如果您想在网址中包含身份验证信息,请执行以下操作:

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

3

上面提到的解决方案都不适合我。我对其进行了进一步研究,发现必须包含useNewUrlParser参数。

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

据我了解,您需要特定版本的MongoDB才能使用它。有关更多详细信息,请检查通过将useNewUrlParser设置为true来避免出现“不赞成使用当前URL字符串解析器”警告。

这是为了消除警告,但显然版本也会影响所需的参数。

我尚未测试所有特殊字符,但它肯定适用于'@#$'。

希望这可以帮助。


1

有时,您需要使用仅接受字符串作为连接字符串的其他工具连接到DB 。所以只用%40更改@符号


例如(不要担心虚拟用户并通过)将其更改为:mongodb:// kipkip:Nolalola22 @@ ds031223.mlab.com:3d223 / mishlo更改为:mongodb:// kipkip:Nolalola22%40@ds031223.mlab.com:3d223 / mishlo
dang

0
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`
);

0

这个解决方案需要额外的依赖,但这最终对我有用。

添加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中找到了这个建议。


0

对于那些与Mongo Compass连接的用户。(MacOSx)在mongodb.com上转到您的群集-> Security(Tab)。

集群安全

然后

编辑密码(按用户名上的“编辑”按钮): 在此处输入图片说明

您将得到一个模态/弹出窗口/对话框:在您的名字下面按编辑密码(默认情况下该按钮为灰色,但仅在您的名字下面显示)->然后按更新用户

对话框弹出窗口中的EditPassword

下一个

如果您的mongo db罗盘应用程序正在运行,请关闭它:(退出Mongo)

退出蒙哥罗盘

下一步:

返回mongodb.com中的“概述”标签,然后选择 连接”

返回概述: 返回概览并选择连接

下一步:

在弹出对话框中,选择Connect with MongoDB Compass,然后在下一个视图中选择要使用的版本(最好是先前的VersionNumber): 与MongoDB Compass连接

选择版本

然后:

复制显示给您的URI字符串

复制Uri字符串

重新打开MongoDB Compass应用程序:

它将为您提供使用检测到的URI字符串的选项/弹出窗口:单击 检测到uri字符串

最后一步:

输入新密码并连接。现在您的连接现在应该成功了。输入新密码并连接


0

用这个,

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


0

我在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下的数据库。


0

这个为我工作

这是MongoDB 2020更新, 如果您使用单独的环境文件,则只需添加您的

mongoose.connect('url',
{
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.