![](/img/trans.png)
[英]Error connecting to the Mongo database. bad auth Authentication failed heroku + atlas mongodb + strapi
[英]“Mongo Error : Authentication failed” can't read datas from 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 的一個 model:
/* 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);
如果需要,我可以向您展示其他文件的代碼,或者如果有人想要,我可以給您 repo 的鏈接,但這是一個非常大的項目,
謝謝,
您似乎將 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 添加到 IP 白名單 IP 中的 Z685AZF7CC75B4470F1 中的 IP 白名單 IP。 (安全 --> 網絡訪問 --> IP 白名單。
此外,您用來連接的用戶必須具有讀取和寫入權限。 您可以在 SECURITY --> Database Access --> MongoDB Users 中檢查您的用戶權限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.