“ Mongo错误:身份验证失败”无法从MongoDB Atlas读取数据

时间:2019-11-03 14:40:10

标签: node.js mongodb express

今天,我想使用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);

如果需要,我可以向您显示其他文件的代码,或者如果有人需要,可以给您提供存储库的链接,但这是一个很大的项目,

谢谢

1 个答案:

答案 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用户”中检查用户的特权。