You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

问题原因

  1. NextJS开发模式的热重载特性,可能导致模型加载时Mongoose还未完成数据库连接,此时mongoose.models是undefined,直接访问.Village就会抛出错误。
  2. 数据库连接逻辑未确保在模型加载前完成初始化。

解决方案

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:06:33