使用 Mongoose 和 SRV 连接字符串将数据插入 MongoDB Atlas

Posted

技术标签:

【中文标题】使用 Mongoose 和 SRV 连接字符串将数据插入 MongoDB Atlas【英文标题】:Inserting data to MongoDB Atlas using Mongoose and SRV connection string 【发布时间】:2018-08-20 23:11:42 【问题描述】:

我在 MongoDB Atlas 中创建了一个集群,但似乎无法向其中写入数据。

const uri = "mongodb+srv://myUser:myPass@myDB-4myav.mongodb.net/portfolio";

我有这个作为我要连接的uri,每次我尝试写入数据库时​​,我都会收到这个错误:

MongoError: 管理员未授权执行命令 insert: “用户”,文档:[[name Daniel _id ObjectIdHex("5aa6d7d6396deb25844ccb52") __v 0]], 排序: false

我已经读到我需要创建一个具有“root”角色的管理员用户,但是当我使用 mongo shell 连接到我的数据库并尝试创建它时,我得到了这个:

错误:无法添加用户:管理员未授权执行命令

所以基本上我没有可以写入我的数据库的用户。

我还尝试在 MongoDB Atlas 网站(当然对于我的集群)上创建一个具有所有可能角色的用户,然后通过 mongo shell 与之连接,但这也失败了。

总结一下:我在 MongoDB Atlas 上创建了一个新集群。如何向其写入数据?

提前致谢,如果我遗漏了一些简单而愚蠢的东西,请随时指出。

【问题讨论】:

您需要通过 Atlas (docs.atlas.mongodb.com/security-add-mongodb-users) 管理用户,并创建一个具有“读取和写入任何数据库”角色的用户帐户(或使用高级选项获得更精细的权限)。 我已经做到了。更妙的是,我还注册了所有可能的角色的帐户,但我仍然被拒绝。 啊!该错误表明您的代码正在尝试将文档插入admin 数据库,该数据库是为用户和角色信息保留的系统数据库。在您的连接字符串中您打算使用portfolio,但srv 连接字符串不支持指定数据库,因此您需要在连接后更改为该数据库。有关解决方法,请参阅 github.com/Automattic/mongoose/issues/6106。 【参考方案1】:

您需要在 Mongo Shell 中创建一个具有 root 角色的用户,

use admin
db.createUser(

   user: "admin",
   pwd: "password",
   roles: [  role: "root", db: "admin"  ]

);
exit;

或者您需要通过图集添加新用户(请参阅下面的快照)

    转到集群 点击安全 点击添加新用户 输入用户名 根据 SCRAM-SHA1 方法创建密码 选择角色地图集管理员 点击添加用户

创建用户后,转到Clusters-->OverView --> CONNECT

    验证IP白名单 选择一种连接方式: 与 Mongo Shell 连接(我正在选择) 连接您的应用程序 连接 MongoDB Compass

$ mongo "mongodb+srv://project-u-s3cgp.azure.mongodb.net/test" --username dbAdmin

MongoDB shell version v3.6.1

Enter password:

connecting to: mongodb+srv://project-u-s3cgp.azure.mongodb.net/test

.........
.........

MongoDB Enterprise project-U-shard-0:PRIMARY>db.user.insert(name:"Daniel")
WriteResult( "nInserted" : 1 )
MongoDB Enterprise O2Ci-U-shard-0:PRIMARY>

我希望,您可以在创建 root 用户后插入记录。

谢谢, 卡西克

【讨论】:

显然我的代码试图写入“admin”数据库,但它不起作用,所以上面的好人解释说这是一个常见的问题,有一个巧妙的解决方法。尽管如此,还是感谢您的帮助!【参考方案2】:

MongoError: 管理员未授权执行命令 insert: "users", 文档: [[name Daniel _id ObjectIdHex("5aa6d7d6396deb25844ccb52") __v 0]], ordered: false

此错误表明您的代码正在尝试将文档插入admin 数据库,这是一个为用户和角色信息保留的系统数据库。

在您的连接字符串中,您打算使用portfolio 数据库。但是,srv 连接字符串格式不支持指定数据库,因此您的选项被忽略并使用默认数据库 admin。连接后需要选择portfolio数据库。

Mongoose 问题跟踪器 (GitHub issue #6106) 中也报告了这一点,用户在其中发布了您可以调整的解决方法:

mongoose.connection.on('connected', function() 
    // Hack the database back to the right one, because when using mongodb+srv as protocol.
    if (mongoose.connection.client.s.url.startsWith('mongodb+srv')) 
        mongoose.connection.db = mongoose.connection.client.db('portfolio');
    
    console.log('Connection to MongoDB established.')
);
mongoose.connect(...);

我已经读到我需要创建一个具有“root”角色的管理员用户,但是当我使用 mongo shell 连接到我的数据库并尝试创建它时,我得到了这个:

您需要manage users via MongoDB Atlas 而不是mongo shell。您可以创建一个具有“读取和写入任何数据库”角色的用户帐户(或使用高级选项更精细的权限)。

【讨论】:

非常感谢!解决方法是我不知道的事情,我一生都找不到它。非常感谢!

以上是关于使用 Mongoose 和 SRV 连接字符串将数据插入 MongoDB Atlas的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 和 MongoDB Atlas Mongoose 连接错误

无法通过节点休息应用程序上的mongoose连接到mongodb-altas,连接失败:“UnhandledPromiseRejectionWarning:错误:连接EACCES”

Socket.io的连接太多

你如何正确连接mongoDB?

无法使用 nestjs/mongoose 连接 mongoDB

无法使用 mongoose 连接到 Mongodb Atlas