使用Mongoose

时间:2018-03-08 18:13:49

标签: node.js mongodb mongoose atlas

我在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,该错误也表明它正试图写信testdb

干杯!

5 个答案:

答案 0 :(得分:2)

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

这对我有用

答案 1 :(得分:1)

不确定您是否看过这个post,但可能是因为您使用的是免费群集?希望这会有所帮助。

<强>更新

我进一步调查了这个问题并自行复制了。我得到了同样的错误。但是,我注意到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

答案 2 :(得分:1)

摆脱@ rithesh-mys的回答。用“ test”代替它是指定数据库。因此,您必须将其更改为要使用的数据库名称。

答案 3 :(得分: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

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

答案 4 :(得分:0)

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