微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

res.data 总是返回一个空数组

如何解决res.data 总是返回一个空数组

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

这是我的文章Controllers.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 将查找名为 文章 的集合。这是因为 Mongoose 在查找集合时会将第一个参数转换为复数形式(如果您写的是“文章”之类的内容,则为小写)。

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。