javascript - 无法使用 Mongoose 连接到 MongoDB
问题描述
我正在关注MERN 堆栈上的这个视频教程,但由于一些非常奇怪的原因,我无法连接到 MongoDB。这个问题让我很沮丧,因为我可能只是错过了一些非常基本的东西,所以如果答案对你来说很明显,请原谅我。
该视频使用 mlab for MongoDB,它不再可用,所以我改用 MongoDB Atlas。我应该用来将我的应用程序连接到数据库的密钥是:
mongodb+srv://<username>:<password>@fs-shopping-list.6rzkd.mongodb.net/<dbname>?retryWrites=true&w=majority
我的密码不包含任何特殊字符,并且我的 IP 地址在白名单中。至于dbname
,我有一个名为“data”的数据库和一个名为“items”的集合,所以我将“data”用于dbname
.
导致我的问题的有问题的代码在一个名为的文件中server.js
:
const db = require('./config/keys').mongoURI; // I keep my key in a separate file in the way shown in the video
// Connect to MongoDB
mongoose
.connect(db, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('MongoDB connected.'))
.catch(err => console.log(err));
当我尝试运行服务器时,我不断收到此错误(我从某些路径中删除了我的名字):
{ MongooseServerSelectionError: bad auth Authentication failed.
at NativeConnection.Connection.openUri (/fs_shopping_list/node_modules/mongoose/lib/connection.js:828:32)
at Mongoose.connect (/fs_shopping_list/node_modules/mongoose/lib/index.js:335:15)
at Object.<anonymous> (/fs_shopping_list/server.js:15:6)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
message: 'bad auth Authentication failed.',
reason:
TopologyDescription {
type: 'ReplicaSetNoPrimary',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers:
Map {
'fs-shopping-list-shard-00-01.6rzkd.mongodb.net:27017' => [ServerDescription],
'fs-shopping-list-shard-00-02.6rzkd.mongodb.net:27017' => [ServerDescription],
'fs-shopping-list-shard-00-00.6rzkd.mongodb.net:27017' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null } }
有人可以帮我找出我做错了什么,以便我可以继续教程吗?感谢您的时间。
编辑:我认为添加另一个数据库访问帐户不会解决问题,因为MongoDB 上的管理员帐户能够读取和写入其数据库。我能想到的唯一可能阻止我的可能是我的诺顿防病毒软件,尽管我不确定如何检验这个假设。
解决方案
这是我如何使用的示例mongoose
:
const connectToMongo = async () => {
try {
await mongoose.connect(mongoUrl, { useNewUrlParser: true });
console.log('connected to MongoDB');
} catch(error) {
console.log('error connection to MongoDB:', error.message);
}
};
这是一个示例mongoUrl
:mongo+srv://username:password@cluster0-ipl5c.mongodb.net/collectionname?retryWrites=true
请确保您创建了一个用户来读取和写入不是管理员帐户的数据库。您从“连接”按钮获得的 URI 字符串可能使用管理员帐户,即使这不是您要在 URI 字符串中使用的帐户,因此请记住这一点。如果您这样做了但仍然无法连接,请使用此清单:
- 检查正确的 IP 是否已列入白名单
- 检查用户是否拥有正确的权限
- 检查您是否使用了正确的数据库名称(集合)
- 检查您的密码中是否有特殊字符(https://docs.atlas.mongodb.com/troubleshoot-connection/#special-pass-characters)
推荐阅读
- php - 无法访问 xampp-vm 上的 laravel-websockets 仪表板
- ubuntu - 尝试在 ubuntu 中安装精益
- python - Python:AttributeError:“WebElement”对象没有属性“send_Keys”
- ubuntu - 如何为现有/新用户编写 LDAP 策略
- python - 使用多处理填充来自多个数据加载器的对象的队列
- mysql - 连接多个表的 PSQL 问题(MIMIC II 数据库)
- c# - 如何通过用户输入在 C# 中获取奇数或偶数?
- pandas - 基于另一个数据帧执行替换
- python - Python - 收集递归函数的输出
- java - 使用在 if 语句中更改的变量