MERN Stack新手MongoDB查询返回空数组问题求助
问题描述
我是MERN Stack新手,在从MongoDB数据库获取数据时遇到问题。数据库连接已成功建立,Schema和Model已开发完成,数据库中手动录入的数据与Schema完全匹配,但调用查询接口时返回空数组[]。相关代码及数据库信息如下:
数据库截图

Schema与Model代码
const mongoose = require("mongoose"); const quoteSchema = new mongoose.Schema({ name: { type: "string", unique: true, trim: true, }, email: { type: "string", unique: true, trim: true, }, heading: { type: "string", unique: true, trim: true, }, content: { type: "string", unique: true, trim: true, }, }); const Quote = mongoose.model("Quote", quoteSchema); module.exports = Quote;
MongoDB文档内容
_id: 63fa9afdb9a2ce7ac01
name: "name"
email: "email@gmail.com"
heading: "heading"
content: "Here goes content"
服务器与路由代码
const express = require("express"); const mongoose = require("mongoose"); const Quote = require("./modals/quoteModal"); const app = express();
mongoose .connect(DB, { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => { console.log("Database connection successful"); }) .catch((error) => { console.log(`Database is not connected ${error}`); }); app.get("/quotes", (req, res) => { Quote.find({}, (err, quotes) => { if (err) { console.log(err); res.status(500).send(err); } else { console.log(quotes); res.status(200).json({ quotes, }); } }); }); const host = "localhost"; const port = process.env.PORT || 8000; app.listen(port, () => { console.log(`MERN-App is running on http://${host}:${port}`); console.log(Quote.schema.obj); });
解决方案
1. 修正Schema中的类型定义
你的Schema里把字段类型写成了字符串 "string",但Mongoose要求使用内置的String构造函数(首字母大写)。这会导致Mongoose无法正确识别字段类型,进而无法匹配数据库中的数据,返回空数组。
修改后的Schema代码:
const mongoose = require("mongoose"); const quoteSchema = new mongoose.Schema({ name: { type: String, // 改为大写的String unique: true, trim: true, }, email: { type: String, unique: true, trim: true, }, heading: { type: String, unique: true, trim: true, }, content: { type: String, unique: true, trim: true, }, }); const Quote = mongoose.model("Quote", quoteSchema); module.exports = Quote;
2. 检查集合名称匹配
Mongoose会自动将Model名称("Quote")转为小写复数形式作为集合名,也就是quotes。请确认你的MongoDB数据库中,数据所在的集合名称确实是quotes,而不是其他名称(比如quote单数)。如果集合名不匹配,也会导致查询不到数据。
如果你的集合名是单数quote,可以在定义Model时指定集合名称:
const Quote = mongoose.model("Quote", quoteSchema, "quote"); // 第三个参数指定集合名
3. 建议使用async/await优化查询代码
回调式的查询写法可以换成更清晰的async/await,便于错误处理:
app.get("/quotes", async (req, res) => { try { const quotes = await Quote.find({}); console.log(quotes); res.status(200).json({ quotes }); } catch (err) { console.log(err); res.status(500).send(err); } });
内容的提问来源于stack exchange,提问作者Adnan Ali
相关产品推荐
相关产品推荐

