求助:解决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()时找不到对应的函数。即使尝试移除这行代码,可能存在缓存未彻底生效的情况,需按以下步骤操作:
- 彻底删除
mongoose.model = {}:确保Product.js中没有这行代码,这是最关键的修复点。 - 统一导入方式:避免在同一个项目中混用
require和import,将Product.js中的导入改为import mongoose from 'mongoose';,保持和其他文件一致的ES模块语法。 - 清理缓存并重启项目:删除
.next文件夹和node_modules/.cache,然后重新安装依赖并启动项目:rm -rf .next node_modules/.cache npm install npm run dev - 验证数据库连接逻辑:确保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
相关产品推荐
相关产品推荐

