Next.js+MongoDB调用API报错:Cannot overwrite `Student` model once compiled
解决Mongoose的OverwriteModelError问题
问题原因
Next.js的API路由在每次请求时都会重新加载模块代码,直接导出mongoose.model()创建的模型,会导致第二次请求时尝试重新编译已存在的模型,触发Cannot overwrite 'Student' model once compiled错误。
另外你的API代码还存在异步处理问题:Student.findOne()返回的是Promise对象,直接判断!student永远为false,无法正确处理查询结果。
解决方案
1. 修改模型文件,避免重复编译模型
修改/models/Student.ts,先检查模型是否已存在,再决定创建还是复用已有模型:
import mongoose from "mongoose"; const studentSchema = new mongoose.Schema({ _id: { type: String, required: true }, firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: { type: String, required: true }, password: { type: String, required: true }, school: { type: String }, zip: { type: Number, required: true }, grade: { type: Number }, profPic: { type: String }, description: { type: String }, areas: [{ type: String }], followers: [{ type: String }], following: [{ type: String }], }); // 优先复用已编译的模型,不存在则创建新模型 export default mongoose.models.Student || mongoose.model("Student", studentSchema);
2. 修复API路由的异步处理问题
修改/api/auth/index.ts,使用async/await处理异步查询,并调整状态码符合HTTP规范:
import { NextApiRequest, NextApiResponse } from "next"; import Student from "../../../models/Student"; import Organization from "../../../models/Organization"; export default async (req: NextApiRequest, res: NextApiResponse) => { if (req.method === "POST") { // 用await获取实际查询结果 const student = await Student.findOne({ email: "test" }); if (!student) { res.status(400).json({ message: "Email not found" }); } else { // 查询成功用200状态码(201用于资源创建成功) res.status(200).json(student); } } else { // 路由不存在用404状态码(401用于未授权场景) res.status(404).json({ message: "URL Not Found" }); } };
内容的提问来源于stack exchange,提问作者PraneethO
相关产品推荐
相关产品推荐

