Mongoose OverwriteModelError报错求助:本地Schema重复编译模型
Mongoose OverwriteModelError 解决办法(不违反作业要求)
问题根源
你每次调用makeModel()都会重新定义Schema,再执行mongoose.model('book_model', schema)创建模型,但Mongoose不允许重复编译同名模型,所以触发了Cannot overwrite 'book_model' model once compiled.错误。
不用外部文件的修复方案
直接在makeModel函数内部加个模型存在性判断,避免重复创建:
function makeModel() { // 先查有没有已经编译好的同名模型 if (mongoose.models['book_model']) { return mongoose.models['book_model']; } // 没有的话再定义Schema并创建模型 const bookSchema = new mongoose.Schema({ // 替换成你的实际字段 title: String, author: String }); return mongoose.model('book_model', bookSchema); }
这样不管调用多少次makeModel(),只有第一次会创建模型,后续直接返回已有的实例,就不会报错了。
关于外部文件导入和本地调用的差异
- 外部文件导入的模型:Node.js模块是单例模式,文件只会被加载一次,模型也只编译一次,所有导入的地方拿到的都是同一个实例。
- 本地
new makeObj()的情况:如果原来的makeModel是构造函数,每次new都会重新走一遍Schema定义和模型创建流程,导致重复编译;但如果按上面的方法修改makeModel,让它内部复用已有的模型,那不管是外部导入还是本地调用,最终拿到的都是同一个Mongoose模型,功能完全一致。 - 总结:只要保证模型只被编译一次,两种方式的效果没有区别。
内容的提问来源于stack exchange,提问作者Yes No
相关产品推荐
相关产品推荐

