无法使用Mongoose连接到MongoDB

问题描述

我正在关注this video tutorial on the MERN stack,由于某些非常奇怪的原因,我无法连接到MongoDB。这个问题使我很沮丧,因为我可能只是缺少了一些非常基本知识,因此,如果答案对您来说很痛苦,请原谅我。

视频使用了针对MongoDB的mlab,该模型已不再可用,因此我改用MongoDB Atlas。我用来将应用程序连接到数据库的密钥是:

mongodb+srv://<username>:<password>@fs-shopping-list.6rzkd.mongodb.net/<dbname>?retryWrites=true&w=majority

我的密码不包含任何特殊字符,并且我的IP地址在白名单上。对于dbname我有一个名为“ data”的数据库,其中有一个名为“ items”的集合,所以我正在为dbname使用“ data”。

引起我问题的代码位于一个名为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 } }

有人可以帮助我找出我做错了什么,以便我继续本教程吗?谢谢您的时间。

编辑:自admin accounts on MongoDB have the ability to read and write to their databases开始,我不认为添加一个数据库访问帐户将解决此问题。我唯一能想到的可能就是阻止我,也许是我的诺顿防病毒软件,尽管我不确定如何验证这个假设。

解决方法

以下是我如何使用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:[email protected]/collectionname?retryWrites=true

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

Database access management

Network access management

Clusters and collections