1

我在 MongoDB Atlas 上有一个新的沙箱集群,我正在使用 Node.js 服务器上的 mongoose 连接它。这是我用来连接的代码:

const mongoDbUrl =
  `mongodb+srv://${username}:${password}@mydb-sandbox-12345.mongodb.net/testdb`

mongoose.connect(mongoDbUrl)
const connection = mongoose.connection

connection.on('connected', () => {
  console.log('Connected to mongodb')
})

在 Atlas 仪表板中readWriteAnyDatabase,我有一个正在与之进行身份验证的用户。身份验证按预期工作。我能够连接到数据库并且连接上没有引发错误。我可以通过删除密码中的一个字符来确认这一点 - 身份验证失败并且我无法连接。

问题是当我尝试插入文档时。

const UserModel = require('./models/User')

UserModel.create({
  name: 'Hello Atlas'
})

我收到以下错误:

MongoError: not authorized on admin to execute command {
insert: "users",
  documents: [
    [{
      name Hello Atlas
    } {
      _id ObjectIdHex("5aa17933d72d25730a340611")
    } {
      __v 0
    }]
  ],
  ordered: false
}

据我所知,与我进行身份验证的用户应该有权在我连接的数据库上读写。我不明白的另一部分是错误表明它正在尝试写入,admin即使我的 url 正在连接到testdb.

4

5 回答 5

6

不确定您是否看过这篇文章,但这可能是因为您在免费集群上?希望这可以帮助。

更新

我进一步研究了这个问题并自己复制了它。我得到了同样的错误。但是,我注意到 Atlas 有一次为我提供了连接字符串的选择。我回到那个页面并选择了I am using driver 3.4 or earlier

连接字符串如下所示:

const mongoDbUrl = `mongodb://${username}:${password}@cluster0-shard-00-00-1wntz.mongodb.net:27017,cluster0-shard-00-01-1wntz.mongodb.net:27017,cluster0-shard-00-02-1wntz.mongodb.net:27017/testdb?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin`;

它与那个连接字符串一起工作。

看起来MongoDB Atlas 的免费版本与 v3.4 一起发布

于 2018-03-08T20:23:41.990 回答
3

如果您使用的是免费集群。将路径中的“admin”更改为“test”:mongodb+srv://username:password@cluster0-yauj8.mongodb.net/test ? retryWrites=true&w=majority

这对我有用

于 2019-10-07T19:20:22.710 回答
1

离开@rithesh-mys 的答案。用“test”替换它是指定数据库。因此,您必须将其更改为您将使用的数据库名称。

于 2019-10-08T01:52:57.563 回答
0

我有同样的问题。我尝试了很多连接字符串,但是用于老年人 mongo shell(3.4 或更早版本)的连接字符串对我有用。

mongodb://my_username:my_password@cluster0-shard-00-00.osobw.mongodb.net:27017,cluster0-shard-00-01.osobw.mongodb.net:27017,cluster0-shard-00-02.osobw.mongodb.net:27017/my_database?ssl=true&replicaSet=atlas-xw3rfy-shard-0&authSource=admin

我认为较新版本的连接字符串不适用于猫鼬,至少适用于免费集群。

于 2020-12-15T21:35:26.830 回答
0

确保您创建的用户具有写入和读取权限。

于 2021-05-26T21:19:56.160 回答