NextJS项目Mongoose模型报错:Cannot read properties of undefined (reading 'Village')
解决NextJS + Mongoose 开发环境下的"Cannot read properties of undefined (reading 'Village')"错误
问题还原
开发环境中反复出现报错:
TypeError: Cannot read properties of undefined (reading 'Village')
模型文件代码如下:
import mongoose from "mongoose"; const {Schema} = mongoose; const VillageSchema = new mongoose.Schema( { id: {type: String}, // 其他字段省略... } ); // prettier-ignore export default mongoose.models.Village || mongoose.model("Village", VillageSchema);
问题原因
- NextJS开发模式的热重载特性,可能导致模型加载时Mongoose还未完成数据库连接,此时
mongoose.models是undefined,直接访问.Village就会抛出错误。 - 数据库连接逻辑未确保在模型加载前完成初始化。
解决方案
方案1:给模型加载加连接前置校验
先确保Mongoose已经连接到数据库,再处理模型导出。可以先写一个数据库连接工具:
// db/connect.js import mongoose from 'mongoose'; export default async function connectDB() { // 如果已经连接就直接返回 if (mongoose.connections[0].readyState) return; await mongoose.connect(process.env.MONGODB_URI); }
然后在模型文件里先调用连接函数:
import mongoose from "mongoose"; import connectDB from './db/connect'; const {Schema} = mongoose; const VillageSchema = new mongoose.Schema( { id: {type: String}, // 其他字段省略... } ); await connectDB(); // prettier-ignore export default mongoose.models.Village || mongoose.model("Village", VillageSchema);
或者在使用模型的API路由里先调用connectDB(),确保连接完成后再导入模型。
方案2:用可选链安全访问模型
直接修改模型导出的判断逻辑,用可选链操作符避免undefined报错:
import mongoose from "mongoose"; const {Schema} = mongoose; const VillageSchema = new mongoose.Schema( { id: {type: String}, // 其他字段省略... } ); // prettier-ignore export default mongoose.models?.Village || mongoose.model("Village", VillageSchema);
当mongoose.models为undefined时,?.会直接返回undefined,进而执行mongoose.model创建新模型。
方案3:通过modelNames()检查模型是否存在
用Mongoose提供的modelNames()方法判断模型是否已注册,更稳妥:
import mongoose from "mongoose"; const {Schema} = mongoose; const VillageSchema = new mongoose.Schema( { id: {type: String}, // 其他字段省略... } ); // prettier-ignore export default mongoose.modelNames().includes('Village') ? mongoose.model('Village') : mongoose.model("Village", VillageSchema);
内容的提问来源于stack exchange,提问作者Floky99
相关产品推荐
相关产品推荐

