今天,我想使用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();
});
});
猫鼬的一个模型:
/* 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);
如果需要,我可以向您显示其他文件的代码,或者如果有人需要,可以给您提供存储库的链接,但这是一个很大的项目,
谢谢
答案 0 :(得分:1)
您似乎将mongodb与mongoose.connect()和MongoClient.connect()都连接了,其中之一就足够了。
如果要使用猫鼬,则可以在主文件(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地图集面板的IP白名单IP中。 (安全->网络访问-> IP白名单。
此外,您用于连接的用户还必须具有读权限。 您可以在“安全性”->“数据库访问”->“ MongoDB用户”中检查用户的特权。