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
相关产品推荐
相关产品推荐

