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

求助:解决TypeError: mongoose.model is not a function错误

Next.js 项目中 TypeError: mongoose.model is not a function 问题解决

问题概述

在Next.js项目中调用mongoose.model()时触发TypeError: mongoose.model is not a function错误,已尝试以下修复操作但未解决:

  • 重装mongoose依赖
  • 将export default改为module.exports
  • 修改MONGO_URI为mongodb://127.0.0.1:27017/
  • 在Product.js中改用import导入mongoose
  • 移除代码中的mongoose.model = {}
  • 在getproducts.js中调整导入顺序,先导入connectDb再导入Product

错误栈信息

error - models\Product.js (23:24) @ model
error - TypeError: mongoose.model is not a function
    at eval (webpack-internal:///(api)/./models/Product.js:48:75)
    at (api)/./models/Product.js (C:\Users\CoreCom\Desktop\next js\havenwear\.next\server\pages\api\getproducts.js:42:1)
    at __webpack_require__ (C:\Users\CoreCom\Desktop\next js\havenwear\.next\server\webpack-api-runtime.js:33:42)
    at eval (webpack-internal:///(api)/./src/pages/api/getproducts.js:5:73)
    at (api)/./src/pages/api/getproducts.js (C:\Users\CoreCom\Desktop\next js\havenwear\.next\server\pages\api\getproducts.js:52:1)
    at __webpack_require__ (C:\Users\CoreCom\Desktop\next js\havenwear\.next\server\webpack-api-runtime.js:33:42)
    at __webpack_exec__ (C:\Users\CoreCom\Desktop\next js\havenwear\.next\server\pages\api\getproducts.js:62:39)
    at C:\Users\CoreCom\Desktop\next js\havenwear\.next\server\pages\api\getproducts.js:63:28
    at Object.<anonymous> (C:\Users\CoreCom\Desktop\next js\havenwear\.next\server\pages\api\getproducts.js:66:3)
    at Module._compile (node:internal/modules/cjs/loader:1218:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1272:10)
    at Module.load (node:internal/modules/cjs/loader:1081:32)
    at Module._load (node:internal/modules/cjs/loader:922:12)
    at Module.require (node:internal/modules/cjs/loader:1105:19)
    at require (node:internal/modules/cjs/helpers:103:18)
    at DevServer.runApi (C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\next-server.js:506:34)
    at DevServer.handleApiRequest (C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\next-server.js:861:21)
    at Object.fn (C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\next-server.js:815:46)
    at async Router.execute (C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\router.js:243:32)
    at async DevServer.runImpl (C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\base-server.js:432:29)
    at async DevServer.run (C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\dev\next-dev-server.js:814:20)
    at async DevServer.handleRequestImpl (C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\base-server.js:375:20)
    at async C:\Users\CoreCom\Desktop\next js\havenwear\node_modules\next\dist\server\base-server.js:157:99
  21 |   // module.exports = mongoose.model("Product", ProductSchema);
  22 |
> 23 | export default mongoose.model("Product", ProductSchema);

相关代码片段

Product.js

const mongoose = require('mongoose');

const ProductSchema = new mongoose.Schema({
    title: {type: String, required:true},
    slug: {type: String, required:true , unique:true},
    desc: {type: String, required:true},
    img: {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},
    
    
  }, {timestamps:true} );
  mongoose.model = {}

  // mongoose.model("Product", ProductSchema)
  // module.exports = mongoose.model("Product", ProductSchema);

export default mongoose.model("Product", ProductSchema);

mongoose.js(数据库连接中间件)

import mongoose from "mongoose";
const connectDb = handler => async (req, res) => {
    // 检查连接是否已建立
    if(mongoose.connections[0].readyState){
        return handler(req,res)
    }
    
    await mongoose.connect(process.env.MONGO_URI)
    return handler(req,res);
}
export default connectDb

getproducts.js(API接口)

import Product from "../../../models/Product"
import connectDb from "../../../middleware/mongoose"
const handler = async (req,res)=>{
    let products = await Product.find()
    res.status(200).json({products})
  }

export default connectDb(handler)

.env.local(环境变量)

MONGO_URI=mongodb://localhost:27017/codeswears

核心解决方案

问题的根源在于Product.js中mongoose.model = {}这行代码直接覆盖了mongoose内置的model方法,导致后续调用mongoose.model()时找不到对应的函数。即使尝试移除这行代码,可能存在缓存未彻底生效的情况,需按以下步骤操作:

  1. 彻底删除mongoose.model = {}:确保Product.js中没有这行代码,这是最关键的修复点。
  2. 统一导入方式:避免在同一个项目中混用require和import,将Product.js中的导入改为import mongoose from 'mongoose';,保持和其他文件一致的ES模块语法。
  3. 清理缓存并重启项目:删除.next文件夹和node_modules/.cache,然后重新安装依赖并启动项目:
    rm -rf .next node_modules/.cache
    npm install
    npm run dev
    
  4. 验证数据库连接逻辑:确保connectDb中间件在模型导入前执行,保证mongoose已完成初始化。调整getproducts.js的导入顺序,先导入connectDb再导入Product:
    import connectDb from "../../../middleware/mongoose"
    import Product from "../../../models/Product"
    

验证修复

完成上述操作后,重新调用/api/getproducts接口,若能正常返回产品数据,则问题已解决。如果仍有错误,检查mongoose版本是否与Next.js兼容,建议使用mongoose v6或v7版本(Next.js 13+对v8版本兼容性可能存在问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:12:59