Next.js中MongoDB查询返回空数组问题排查求助
排查Next.js中MongoDB查询返回空数组的解决方案
1. 集合名称不匹配问题
你提到集合名称是product,但代码中mongoose模型定义用的是:
export default mongoose.model("products", productSchema);
Mongoose默认会将模型名转换为小写复数形式作为集合名,若你的实际集合是product(单数),会导致查询的集合不对。解决方法:
- 若集合是复数
products,将模型名改为"Product"(Mongoose会自动转为products) - 若集合确实是单数
product,显式指定集合名称:
export default mongoose.model("Product", productSchema, "product"); // 第三个参数指定实际集合名
2. Schema类型定义不规范
你的Schema中type用的是字符串"String",虽然Mongoose有兼容性,但规范写法应该用构造函数String/Boolean,避免潜在解析问题:
const productSchema = new mongoose.Schema({ img: { type: String, // 去掉引号 required: false, }, category: { type: String, required: false, }, price: { type: String, required: false, }, description: { type: String, required: false, }, heading: { type: String, required: false, }, available: { type: Boolean, // 去掉引号 required: false, }, });
3. 数据库连接逻辑优化
当前的connectMongo函数没有处理重复连接问题,Next.js的API路由可能重复调用连接导致异常,修改为检查连接状态后再连接:
import mongoose from "mongoose"; const connectMongo = async () => { // 检查是否已连接 if (mongoose.connection.readyState === 1) { return Promise.resolve(); } // 移除过时的useNewUrlParser,当前Mongoose版本已默认启用 return mongoose.connect(process.env.MONGODB_URI); }; export default connectMongo;
4. API路由错误处理修复
你的错误处理中res.status(err)是错误的,err是Error对象而非状态码,应统一返回500状态并携带错误信息:
export default async function handler(req, res) { try { await connectMongo(); const response = await products.find(); res.status(200).json(response); } catch (err) { console.error(err); // 用console.error更适合错误日志 res.status(500).json({ error: err.message }); // 返回错误信息便于排查 } }
5. 基础排查步骤
- 确认
process.env.MONGODB_URI配置正确,能正常连接到目标数据库 - 检查MongoDB数据库中
product(或products)集合是否有数据 - 在API路由中添加日志,确认连接状态和查询结果:
await connectMongo(); console.log("数据库连接状态:", mongoose.connection.readyState); // 1表示已连接 const response = await products.find(); console.log("查询到的数据条数:", response.length);
内容的提问来源于stack exchange,提问作者Jaylal Sahoo
相关产品推荐
相关产品推荐

