如何解决Mongoose的OverwriteModelError:无法覆盖已编译的IUser模型
解决Mongoose OverwriteModelError: Cannot overwrite
IUser model once compiled错误 出现这个错误的核心原因是模型名称不匹配:你代码里检查的是mongoose.models.User,但创建模型时指定的名称是"IUser",两边名称不一致,导致每次导入模块时都找不到已存在的模型,进而重复创建,触发重复覆盖的报错。
修复方案如下:
统一模型名称(二选一即可)
- 保持创建模型的名称为
"IUser",修改检查的模型名与之匹配:
const UserModel = (mongoose.models.IUser as mongoose.Model<IUser>) || mongoose.model<IUser>("IUser", UserSchema); export default UserModel;- 保持检查的模型名为
User,修改创建模型的名称与之匹配:
const UserModel = (mongoose.models.User as mongoose.Model<IUser>) || mongoose.model<IUser>("User", UserSchema); export default UserModel;- 保持创建模型的名称为
热重载环境额外优化(可选)
如果是在Next.js这类有热重载的开发环境中,还可以改用mongoose.connection.models来检查已存在的模型,避免热重载导致的重复创建问题:const UserModel = (mongoose.connection.models.IUser as mongoose.Model<IUser>) || mongoose.model<IUser>("IUser", UserSchema); export default UserModel;
内容的提问来源于stack exchange,提问作者Abdul Hannan
相关产品推荐
相关产品推荐

