"Mongo Error : Authentication failed"无法从MongoDB Atlas读取数据



今天我想使用MongoDB Atlas中的集群来获得在线数据库,而不是我的MongoDB本地数据库(运行非常好(,

所以,我遵循了一个mLab教程,

它可以完美地在数据库中写入(当我在我的网站中进行身份验证时,它会在数据库中添加数据,当我在聊天中写入消息时,它还会添加消息,等等…(

但当我想阅读这些数据时,我得到了:

MongoTimeoutError: Server selection timed out after 30000 ms
MongoError: Authentication failed

我的server/index.js中的连接似乎可以工作,因为我得到了控制台日志:

mongoose
.connect(
`mongodb+srv://${process.env.USER}:${process.env.PASSWORD}@ofilms-demo-f9iwz.mongodb.net/test?retryWrites=true&w=majority`,
{ useNewUrlParser: true, useUnifiedTopology: true }
).then(() =>
console.log(
"working"
)
)
.catch(err => console.log(err));

但不是其他路线,比如这条(将所有用户都放在数据库中(:

const mongo = require("mongodb").MongoClient;
router.get("/getAll", function(req, res) {
console.log("get all users");
const client = new mongo(`mongodb+srv://${process.env.USER}:${process.env.PASSWORD}@ofilms-demo-f9iwz.mongodb.net/test?retryWrites=true&w=majority`, {
useNewUrlParser: true,
useUnifiedTopology: true
});
client.connect(err => {
const collection = client.db("test").collection("users");
collection.find().toArray((err, items) => {
res.json(items);
});
client.close();
});
});

Mongoose的一个模型:

/* eslint-disable no-undef */
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const UserSchema = new Schema({
username: {
type: String,
required: true
},
email: {
type: String,
required: true,
lowercase: true
},
password: {
type: String,
required: true
},
firstname: String,
lastname: String,
sexe: String,
mobilePhone: String,
departement: Number,
city: String,
moviesLiked: Array,
seriesLiked: Array,
moviesDisliked: Array,
seriesDisliked: Array,
moviesFavorites: Array,
seriesFavorites: Array,
lists: Array,
creationDate: {
type: Date,
default: Date.now
},
lastConnection: Date,
isVerified: Boolean,
isAdmin: Boolean,
isModerator: Boolean,
isConnected: Boolean
});
module.exports = User = mongoose.model("users", UserSchema);

如果需要,我可以向你展示其他文件的代码,或者如果有人想要,我可以给你回购的链接,但这是一个非常大的项目,

谢谢,

您似乎将mongodb与mongoose.connect((和MongoClient.connect((连接起来,其中一个就足够了。

如果你想使用mongoose,你可以连接到主文件(index.js或app.js(中的mongodb,当连接到数据库时,你的服务器可以开始监听。而且您不需要在路由中连接mongodb。

例如:

index.js(主文件(

const express = require("express");
const app = express();
require("dotenv").config();
const users = require("../routes/users"); //todo: correct the users route path
app.use("/api/users", users);
mongoose
.connect(
`mongodb+srv://${process.env.USER}:${process.env.PASSWORD}@ofilms-demo-f9iwz.mongodb.net/test?retryWrites=true&w=majority`,
{ useNewUrlParser: true, useUnifiedTopology: true }
)
.then(() => console.log("working"))
.catch(err => console.log(err));

在你的路线:(users.js(

const express = require("express");
const router = express.Router();
const User = require("../../models/User");
router.get("/users", async (req, res) => {
const users = await User.find({});
res.send(users);
});
module.exports = router;

正如您所看到的,我们的路由中没有与连接相关的代码,因为当应用程序启动时,我们已经连接了。

要使此代码工作,您需要将本地IP添加到mongodb atlas面板中的IP白名单IP中。(安全-->网络访问-->IP白名单.

此外,您用来连接的用户必须已读取写入权限。您可以在SECURITY-->数据库访问-->MongoDB用户中检查您的用户权限。

最新更新