首页 > 解决方案 > 无法使用 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 上的管理员帐户能够读取和写入其数据库。我能想到的唯一可能阻止我的可能是我的诺顿防病毒软件,尽管我不确定如何检验这个假设。

标签: javascriptreactjsmongodbmongoosemern

解决方案


这是我如何使用的示例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);
  }
};

这是一个示例mongoUrlmongo+srv://username:password@cluster0-ipl5c.mongodb.net/collectionname?retryWrites=true

确保您创建了一个用户来读取和写入不是管理员帐户的数据库。您从“连接”按钮获得的 URI 字符串可能使用管理员帐户,即使这不是您要在 URI 字符串中使用的帐户,因此请记住这一点。如果您这样做了但仍然无法连接,请使用此清单:

数据库访问管理

网络访问管理

集群和集合


推荐阅读