簡體   English   中英

“Mongo 錯誤:身份驗證失敗”無法從 MongoDB Atlas 讀取數據

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM