«Ошибка Mongo: аутентификация не удалась» не может прочитать данные из MongoDB Atlas - PullRequest
0 голосов
/ 03 ноября 2019

Сегодня я хотел использовать кластеры в MongoDB Atlas для получения онлайн-базы данных вместо локальной базы данных MongoDB (которая работала отлично),

Итак, я следовал руководству по mlab,

Отлично работает при записи в базу данных (когда я авторизируюсь на своем веб-сайте, он добавляет данные в базу данных, когда я пишу сообщение в чате, он добавляет сообщение и т. Д ...)

Но когда я хочу прочитать эти данные, я получаю:

MongoTimeoutError: Server selection timed out after 30000 ms

MongoError: Authentication failed

Соединение в моем сервере / 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);

Я могу показать вамкод других файлов, если необходимо, или дать вам ссылку на репозиторий, если кто-то хочет, но это действительно большой проект,

Спасибо,

1 Ответ

1 голос
/ 03 ноября 2019

Похоже, что вы подключаете mongodb как к mongoose.connect (), так и к MongoClient.connect (), одного из них будет достаточно.

Если вы хотите использовать mongoose, вы можете подключиться к mongodb в своем основном файле(index.js или app.js), и при подключении к БД ваш сервер может начать слушать. И вам не нужно подключать 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));

в вашем маршруте: (пользователи.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-адресов на панели атласа mongodb. (БЕЗОПАСНОСТЬ -> Доступ к сети -> Белый список IP-адресов.

Также пользователь, которого вы используете для подключения, должен прочитать привилегии записи. Вы можете проверить привилегии своих пользователей в SECURITY -> Доступ к базе данных ->Пользователи MongoDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...