我正在尝试使用Node.js中的Mongoose使用用户名和密码连接到MongoDB数据库。所有文档都说连接字符串应该像
mongodb://username:password@host:port/db
但是,密码中包含“ @”字符。我怎样才能用猫鼬会理解的连接字符串呢?我可以不使用密码中的“ @”,还是必须使用其他连接方法?
我正在尝试使用Node.js中的Mongoose使用用户名和密码连接到MongoDB数据库。所有文档都说连接字符串应该像
mongodb://username:password@host:port/db
但是,密码中包含“ @”字符。我怎样才能用猫鼬会理解的连接字符串呢?我可以不使用密码中的“ @”,还是必须使用其他连接方法?
@
密码中的字符需要在URL中编码。编码@
字符为%40
。但是,%
字符也需要编码。因此,假设您的密码是,p@ss
最终的编码密码应为p%2540ss
Answers:
使用以下语法:
mongoClient.connect("mongodb://username:p%40ssword@host:port/dbname?authSource=admin", {
useNewUrlParser: true
}, function(err, db) {
}
);
{uri_decode_auth: true}
乍一看,我很想念,但是一旦发现,它就起作用了。谢谢。
{uri_decode_auth: true}
如果您在NodeJS中并使用mongoDB的本机驱动程序,则应将其作为单独的对象传递。
使用调用的options
参数mongoose.connect
来指定密码,而不是将其包括在URL字符串中:
mongoose.connect('mongodb://localhost/test',
{user: 'username', pass: 'p@ssword'},
callback);
我也面临同样的问题。我已经解决了将编码后的密码添加到连接字符串中的问题。而且效果很好。
(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',
encodeURIComponent()
它就是可以完成这项工作的内置功能。
如果您使用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"
上面提到的解决方案都不适合我。我对其进行了进一步研究,发现必须包含useNewUrlParser参数。
mongoose.connect(db, {
useNewUrlParser : true
},
err => {
if (err){
console.error('Error: ' + err)
}
else{
console.log('Connected to MongoDb')
}
})
据我了解,您需要特定版本的MongoDB才能使用它。有关更多详细信息,请检查通过将useNewUrlParser设置为true来避免出现“不赞成使用当前URL字符串解析器”警告。
这是为了消除警告,但显然版本也会影响所需的参数。
我尚未测试所有特殊字符,但它肯定适用于'@#$'。
希望这可以帮助。
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`
);
对于那些与Mongo Compass连接的用户。(MacOSx)在mongodb.com上转到您的群集-> Security(Tab)。
然后
您将得到一个模态/弹出窗口/对话框:在您的名字下面按编辑密码(默认情况下该按钮为灰色,但仅在您的名字下面显示)->然后按更新用户
下一个:
如果您的mongo db罗盘应用程序正在运行,请关闭它:(退出Mongo)
下一步:
返回mongodb.com中的“概述”标签,然后选择 连接”
下一步:
在弹出对话框中,选择Connect with MongoDB Compass,然后在下一个视图中选择要使用的版本(最好是先前的VersionNumber):
然后:
复制显示给您的URI字符串:
重新打开MongoDB Compass应用程序:
它将为您提供使用检测到的URI字符串的选项/弹出窗口:单击是
最后一步:
如果用户名或密码包含@符号,冒号:,斜杠/或百分号%字符,请使用百分比编码。
Mongo文件:https : //docs.mongodb.com/manual/reference/connection-string/
我在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下的数据库。
这个为我工作
这是MongoDB 2020更新, 如果您使用单独的环境文件,则只需添加您的
mongoose.connect('url',
{
useNewUrlParser: true,
useUnifiedTopology: true
});