导出后Mongoose模型DemandeTransports变为undefined问题
问题分析与解决方案
核心问题
你遇到的DemandeTransports导入后为undefined、调用findOne报错的情况,主要是Next.js模块缓存/热重载机制、Mongoose模型复用逻辑或导入路径配置导致的。
具体修复步骤
1. 修正Mongoose模型复用逻辑
在Schema.js中,确保模型创建时严格复用已注册的实例,避免因热重载重复创建:
// @/components/database/model/Schema.js import { Schema } from "mongoose"; import mongoose from "mongoose"; // ... 用户模型代码不变 ... const demandeTransportSchema = new Schema({ date: { type: Date, required: true }, user: { type: Object, required: true }, values: { type: Object, required: true }, }); // 替换原DemandeTransports定义,去掉可选链的潜在问题 const DemandeTransports = mongoose.models.demandeTransport || mongoose.model("demandeTransport", demandeTransportSchema); export { Users, DemandeTransports };
2. 检查Next.js路径别名配置
确认jsconfig.json或tsconfig.json中已正确配置@/别名,否则导入路径会失效:
// jsconfig.json { "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["*"] } } }
3. 重构数据库操作函数(异步化+错误处理)
原函数中存在两个问题:未等待数据库连接完成、res对象未定义。修改为异步函数并完善逻辑:
// @/lib/getAllDemandesFromUser.js import connectMongo from "@/components/database/conn"; import { DemandeTransports } from "@/components/database/model/Schema"; export default async function getAllDemandesFromUser(email) { try { // 必须等待数据库连接完成后再操作模型 await connectMongo(); // 现在可以正常调用模型方法 const result = await DemandeTransports.findOne({ "user.email": email }); return result; } catch (error) { // 抛出错误或返回错误信息,避免使用未定义的res throw new Error(`La connection à la bdd mongo a échoué avec l'erreur : ${error.message}`); } }
4. 备选方案:动态获取模型(解决热重载问题)
如果热重载仍导致模型丢失,可以改用函数动态获取模型:
// @/components/database/model/Schema.js // ... 其他代码不变 ... // 新增动态获取模型的函数 export const getDemandeTransportsModel = () => { return mongoose.models.demandeTransport || mongoose.model("demandeTransport", demandeTransportSchema); }; // ... 原有导出不变 ...
然后在业务函数中调用:
// @/lib/getAllDemandesFromUser.js import connectMongo from "@/components/database/conn"; import { getDemandeTransportsModel } from "@/components/database/model/Schema"; export default async function getAllDemandesFromUser(email) { try { await connectMongo(); const DemandeTransports = getDemandeTransportsModel(); const result = await DemandeTransports.findOne({ "user.email": email }); return result; } catch (error) { throw new Error(`La connection à la bdd mongo a échoué avec l'erreur : ${error.message}`); } }
内容的提问来源于stack exchange,提问作者Nathos8
相关产品推荐
相关产品推荐

