res.data 始终返回空数组

res.data Always Returning an Empty Array

我正在创建一个 MERN 杂志网络应用程序,向用户显示存储在 mongodb 中的文章。我有多个数据库,在 Mongo Atlas 上称为 userDB 和 articleDB。这些数据库位于单个集群中。问题是,在我的一个控制器 articleController.js 中,集合上的查找方法总是 returning 一个空数组。这导致我的应用程序中断,因为它始终有效并且没有 return 一个空数组,而是一个包含三个最新文章对象的数组,然后我开始将我的数据从我的本地 mongodb.

这是我的 articleControllers.js:

的代码片段
const express = require('express');
const app = express();
const cors = require("cors");
let articleSchema = require('../models/article.model');
const mongoose = require("mongoose");

const conn = mongoose.createConnection("mongodb+srv://<username>:<password>@cluster0.c94ps.mongodb.net/articleDB?retryWrites=true&w=majority", { useNewUrlParser: true, useUnifiedTopology: true, dbName: "articleDB" });

const Article = conn.model('article', articleSchema); // update: this is where the problem was.
const fs = require("fs");
const path = require("path");

app.use(cors({
    origin: 'http://localhost:3000',
    credentials: true 
}));

app.use('/images', express.static(path.join(__dirname, '/images')));

exports.article_home_section_display_get = (req, res) => {
    const id = req.params.id;
    const firstLetter = id.charAt(0).toUpperCase();
    const restOfWord = id.substring(1, id.length);
    const fullWord = firstLetter + restOfWord;
    Article.find({article_section: fullWord}).sort({article_date: -1}).limit(3)
        .then(articles => {
            console.log(articles); //empty array
            console.log(`Found and sent over three of the latest ${fullWord} articles.`);
            res.send(articles);
        })
        .catch(err => {
            console.log(err);
        });
};

其中尖括号中的用户名密码是我的实际用户名和密码。

难道在连接多数据库的时候使用mongoose.createConnection连接mongo Atlas其实是不可能的?又或许,由于我忽略了某种错误,我的应用程序根本没有连接到 Atlas?对了,Atlas上的数据库叫articleDB,里面的集合是article.

我在这个问题上苦苦挣扎了很长时间,当我做别人做的事情时,我无法弄清楚哪里出了问题。因此,我们将不胜感激任何帮助。

mongoose.connect 放在 app.js 文件中而不是控制器中,然后这样做

const dbURI = "mongodb+srv://<username>:<password>@cluster0.c94ps.mongodb.net/articleDB?retryWrites=true&w=majority";
mongoose.connect(dbURI,{useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false}).then((result) => {
  console.log('connected to db')
}).catch((err) => console.log(err));

创建一个 artilce.js 文件并像这样导出模型:

const mongoose = require('mongoose');
const Schema =mongoose.Schema;

const articleSchema = new Schema({

});

const Article= mongoose.model('article', articleSchema);
module.exports = Article;

在控制器中需要文章

const Article = require('./models/article'); // path of article.js file

好的,经过一天的搜索,我终于找到了答案。问题出在:

const Article = conn.model("article", articleSchema);

作为第一个参数不正确,"article",是表示数据库中集合名称的输入。这意味着 Mongoose 将查找名为 articles 的集合。这是因为 Mongoose 在查找集合时会将第一个参数转换为复数(如果你写的是“Article”之类的东西,则转换为小写)。

但是,我的数据库名为 articleDB,我在该数据库中的集合名为 article(集合名称不是复数!)。所以当Mongoose在我的数据库中查找集合时,将第一个参数"article"转换为articles时,就找不到了.因此,导致 res.data 返回一个空数组。

为了解决这个问题,可以在.model函数中添加第三个参数。像这样,解决了我的问题:

const Article = conn.model("article", articleSchema, "article");

其中第三个参数 "article" 让 Mongoose 知道它不应该复数(并转换为小写)第一个参数。相反,第三个参数让 Mongoose 知道集合的明确名称。

关于第一个参数在有三个参数的情况下的作用,我不太确定。但是,一旦您在数据库中明确定义了集合的名称,第一个参数就显得多余了。它可能就像一个占位符,用于区分两参数和三参数 .model 函数。