带有“@”的 MongoDB 密码

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

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

但是,密码中包含“@”字符。我怎样才能用这个连接字符串让猫鼬能够理解呢?我可以在密码中避开“@”吗? 还是我必须使用另一种连接方法?

119221 次浏览

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

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

使用以下语法:

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


}
);

试试这个,朋友们:

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

test是我的数据库名称
admin is my the db for authenticating
viettd是我的用户名
abc@123是我的密码

使用 pwd 代替 pass,这对我的3.2版本很有用

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

有时您需要使用其他只接受字符串作为连接字符串的 工具连接到数据库。用% 40改变@符号

If your password has special characters:

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

此外,如果密码包含百分比, 因为百分比(“%”)字符用作百分比编码的八位元组的指示器,所以百分比编码的八位元组必须为“% 25”,才能在 URI 中用作数据

例如,如果密码是 John% Doe,则新转换的密码将是 John% 25Doe 或 如果密码是保罗% 20等待,新的密码将是保罗% 2520等待

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

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

(1)从 https://www.url-encode-decode.com编码你的密码
(2) Replace your password with encoded one.
(3)它应该能够很好地工作。

例如:
实际密码: ABCDEX $KrrpvDzRTy‘@drf.’;
编码密码: ABCDEX% 24KrrpvDzRTy% 60% 40drf.% 27% 3B3X

Mongodb://user1: ABCDEX% 24KprpvDzRTy% 60% 40drf% 27% 3B3X@dstest.com: 1234,ds1234-test.com: 19889/mongo-dev? plicaSet = rs-ds123546978 & ssl = true’,

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

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

据我所知,您需要一个特定版本的 MongoDB 来使用它。有关详细信息,请查看 通过将 useNewUrlParser 设置为 true 来避免“当前 URL 字符串解析器已被弃用”的警告

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

我没有测试所有的特殊字符,但它肯定与’@# $’工程。

Hope this helps.

This solution requires an extra dependency, but it was what finally worked for me.

mongodb-uri添加到项目中,并在代码中添加以下代码行:

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

我在 mongoose的 GitHub 问题 # 6044中发现了这个建议。

If you use Mongodb native Node.js driver, this is what works for me as of 3.1 driver version. Assume your url doesn't contain auth info.

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"

用这个,

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

如果用户名或密码包含 at sign@、冒号: 、斜杠/或% 符号% 字符,则使用 编码百分比

Mongo Docs: 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% 40 password 表示你的密码,并假设它有一个特殊的字符(例如@- 由% 40表示)-username 是你的 mongodb 用户名,ip-你的 ip 地址和 sample _ db 是你想要连接到的 mongodb 下的数据库。

这招对我很管用

这是 MongoDB 2020更新 如果您使用一个单独的 env 文件,那么只需添加您的

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

显然,我也遇到过类似的情况,但除了避免密码中的特殊字符之外,我找不到任何解决办法。我尝试了其他特殊字符(^% &) ,它们都不适用于 URL 字符串中的密码。但 MongoDB 医生只说

: / ? # [ ] @

这些字符需要按百分比编码。

I tried encoding most of them in my password combinations, but none of them are working.