首页 > 解决方案 > 如果设置了 databasename,Mongoose 会超时

问题描述

我对 Linux、NodeJs 和 MongoDB 比较陌生,但我设置了一个运行 MongoDB(数据库版本 v4.0.16)的 Linux 服务器。

我添加了两个这样的用户。一个叫 mongo-admin,一个叫 mongo-root。

# mongo

> use admin
> db.createUser({ 
    user: "mongo-admin", 
    pwd: "myAwesomePassword", 
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] 
})

> db.createUser({ 
    user: "mongo-root", 
    pwd: "myAwesomePassword", 
    roles: [ { role: "root", db: "admin" } ] 
})

然后我像这样在 /etc/mongod.conf 中启用了身份验证

security:
  authorization: "enabled"

在我的开发机器上,我设置了一个小 NodeJS 脚本,它尝试使用 mongoose 连接到服务器,并在那里简单地添加一个文档。

现在情况很奇怪。如果我mongodb://mongo-root:myAwesomePassword@100.100.100.100:27017用作连接字符串,一切正常,并创建一个名为的新数据库test并添加文档。但是一旦我/mydatabasename在字符串的末尾添加一个,猫鼬会在尝试连接 30 秒后突然超时。

如果我使用名为 Robo3T 的软件连接到 MongoDB,我可以正常连接,并且我也有权创建一个新数据库。

我还检查/etc/log/mongod.log并发现了这个错误:

2020-02-05T07:40:22.006+0000 I ACCESS   [conn27] SASL SCRAM-SHA-1 authentication failed for mongo-root on mydatabasename from client 101.101.101.101:51270 ; UserNotFound: Could not find user mongo-admin@mydatabasename

这是我连接到数据库的方式

mongoose.connect(
  "mongodb://mongo-root:myAwesomePassword@100.100.100.100:27017/mydatabasename",
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true
  }
);

似乎 mongodb 正在数据库中寻找应该创建的用户,而不是在管理数据库中。

标签: node.jsmongodbmongoose

解决方案


检查连接字符串 URI 格式

 mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[database][?options]]

/数据库

可选的。如果连接字符串包含用户名:密码@ 形式的身份验证凭据,则要进行身份验证的数据库的名称。如果未指定 /database 并且连接字符串包含凭据,则驱动程序将对 admin 数据库进行身份验证。另请参阅 authSource。

授权来源

指定与用户凭据关联的数据库名称。 authSource 默认为连接字符串中指定的数据库

实际上,对于这一点,文档并不是 100% 正确的,连接字符串必须是这样的:

mongodb://mongo-root:myAwesomePassword@100.100.100.100:27017/mydatabasename?authSource=admin 

推荐阅读