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

Next.js集成Mongoose报错mongoose.model() is not a function排查

错误原因

核心触发点是模块规范混用:

  • models/Product文件同时使用CommonJS规范的require()引入mongoose,又使用ES Module规范的export default导出模型。Next.js默认对项目源码按ES Module解析,混用规范会导致require("mongoose")返回的是模块包装对象而非mongoose核心实例,对象上不存在model方法,调用时直接抛出TypeError: mongoose.model() is not a function。

代码中还存在3个会引发后续异常的隐藏问题:

  • Product Schema中title字段重复定义两次,会导致Schema解析异常
  • API路由中res.status.json写法错误,status是需要传入HTTP状态码的函数,直接链式调用json会触发响应阶段报错
  • 未做模型重复注册判断,Next.js开发环境热重载时会触发OverwriteModelError
修复方案

按文件逐一修改即可:

1. 修正Product模型文件(路径models/Product.js)

统一使用ES Module规范引入依赖,删除重复字段,增加热重载兼容判断:

import mongoose from "mongoose";

// 避免开发环境热更新时重复注册模型报错
const productSchema = new mongoose.Schema(
  {
    title: { type: String, required: true },
    slug: { type: String, required: true, unique: true },
    desc: { type: String, required: true },
    category: { type: String, required: true },
    size: { type: String },
    color: { type: String },
    price: { type: Number, required: true },
    availableQty: { type: Number, required: true },
    img: { type: String, required: true },
  },
  { timestamps: true }
);

export default mongoose.models.Product || mongoose.model("Product", productSchema);

2. 修正getProducts接口文件(路径pages/api/getProducts.js)

修复响应方法的写法错误:

import Product from "../../models/Product";
import connectDb from "../../middleware/mongoose";
const handler = async (req, res) => {
  let products = await Product.find();
  // status方法需传入HTTP状态码后再调用json返回数据
  res.status(200).json({ products });
};

export default connectDb(handler);

3. (可选优化)数据库连接中间件增加错误捕获

为中间件补充连接失败的容错逻辑,避免数据库连接异常时服务直接崩溃:

import mongoose from "mongoose";

const connectDb = (handler) => async (req, res) => {
  if (mongoose.connections[0].readyState) {
    return handler(req, res);
  }
  try {
    await mongoose.connect(process.env.MONGO_URI);
  } catch (err) {
    return res.status(500).json({ error: "数据库连接失败" });
  }
  return handler(req, res);
};

export default connectDb;

修改完成后重启Next.js开发服务,再访问接口即可正常返回商品数据。


内容的提问来源于stack exchange,提问作者front_dev_j

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:48:33