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