node.js - 如果设置了 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 正在数据库中寻找应该创建的用户,而不是在管理数据库中。
解决方案
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
推荐阅读
- pandas - 在一个系列中划分元组
- mysql - Mac Big Sur MariaDB 将无法运行
- javascript - Javascript:从 Electron 渲染器导入 React
- heroku - 防止在 Heroku 上安装可选依赖项
- bazel - 使用 Bazel 构建 Drake 时遇到问题
- ssl - Openshift:S2I:dotnet restore:UntrustedRoot:构建时如何添加可信证书?
- typescript - 为什么 TypeScript 将过滤后的字符串数组解释为字符串 | 布尔数组
- python - TypeError:列表索引必须是整数或切片,而不是元组我得到一个 TypeError:
- html - 我怎样才能使我的 td 和 th 具有相同的宽度 - 包括仅放在 tbody 上的滚动条?
- android - Flutter:任务':cloud_firestore:extractDebugAnnotations'的执行失败