无法使用 Mongoose 连接到 MongoDB
Can't Connect to MongoDB using Mongoose
我正在关注 this video tutorial on the MERN stack 但由于某些非常奇怪的原因我无法连接到 MongoDB。这个问题让我很沮丧,因为我可能只是遗漏了一些非常基本的东西,所以如果答案对你来说很明显,请原谅我。
该视频使用 mlab 作为 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 } }
有人可以帮我找出我做错了什么,以便我可以继续教程吗?谢谢你的时间。
编辑:我认为添加另一个数据库访问帐户不会解决问题,因为 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:password@cluster0-ipl5c.mongodb.net/collectionname?retryWrites=true
请确保您创建一个用户来读取和写入数据库而不是管理员帐户。 URI您从“连接”按钮获得的字符串可能使用管理员帐户 ,即使这不是您想要在 URI 字符串中使用的帐户, 所以请记住这一点。如果您这样做但仍然无法连接,请使用此清单:
- 检查正确的 IP 是否已列入白名单
- 检查用户是否拥有正确的权限
- 检查您使用的数据库名称(集合)是否正确
- 检查您的密码中是否包含特殊字符 (https://docs.atlas.mongodb.com/troubleshoot-connection/#special-pass-characters)
尝试在选项中添加dbName
:
await mongoose.connect('mongodb://root:example@mongo:27017', { dbName: "blog" });
我正在关注 this video tutorial on the MERN stack 但由于某些非常奇怪的原因我无法连接到 MongoDB。这个问题让我很沮丧,因为我可能只是遗漏了一些非常基本的东西,所以如果答案对你来说很明显,请原谅我。
该视频使用 mlab 作为 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 } }
有人可以帮我找出我做错了什么,以便我可以继续教程吗?谢谢你的时间。
编辑:我认为添加另一个数据库访问帐户不会解决问题,因为 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:password@cluster0-ipl5c.mongodb.net/collectionname?retryWrites=true
请确保您创建一个用户来读取和写入数据库而不是管理员帐户。 URI您从“连接”按钮获得的字符串可能使用管理员帐户 ,即使这不是您想要在 URI 字符串中使用的帐户, 所以请记住这一点。如果您这样做但仍然无法连接,请使用此清单:
- 检查正确的 IP 是否已列入白名单
- 检查用户是否拥有正确的权限
- 检查您使用的数据库名称(集合)是否正确
- 检查您的密码中是否包含特殊字符 (https://docs.atlas.mongodb.com/troubleshoot-connection/#special-pass-characters)
尝试在选项中添加dbName
:
await mongoose.connect('mongodb://root:example@mongo:27017', { dbName: "blog" });