今天我想使用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用户中检查您的用户权限。