Development 模式下修改文件 Mongoose 出错
zhuscat opened this issue · 2 comments
zhuscat commented
error occured: OverwriteModelError: Cannot overwrite `Book` model once compiled.
这是我的 model 文件:
import {Schema, model} from 'mongoose';
const bookSchema = Schema({
title: String,
author: String,
});
const Book = model('Book', bookSchema);
export default Book;
然后在 controllers 里面:
import Book from '../models/Book';
export default async (ctx, next) => {
const books = await Book.find().limit(20).exec()
ctx.body = books.map(book => {
return book.toObject();
});
}
数据库连接暂时写在了 middlewareRegister
里:
mongoose.connect(DB_CONN_STR);
当修改文件,刷新页面就出现下面的错误。
完整版错误:
error occured: OverwriteModelError: Cannot overwrite `Book` model once compiled.
at Mongoose.model (/Users/Leaf/Downloads/mirror-web-isomorphic-master/node_modules/mongoose/lib/ind
ex.js:376:13)
at Object.<anonymous> (/Users/Leaf/Downloads/mirror-web-isomorphic-master/platforms/server/models/B
ook.js:24:23)
at Module._compile (module.js:541:32)
at loader (/Users/Leaf/Downloads/mirror-web-isomorphic-master/node_modules/babel-register/lib/node.
js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (/Users/Leaf/Downloads/mirror-web-isomor
phic-master/node_modules/babel-register/lib/node.js:154:7)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/Leaf/Downloads/mirror-web-isomorphic-master/platforms/server/controll
ers/testCtrl.js:1:1)
at Module._compile (module.js:541:32)
at loader (/Users/Leaf/Downloads/mirror-web-isomorphic-master/node_modules/babel-register/lib/node.
js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (/Users/Leaf/Downloads/mirror-web-isomor
phic-master/node_modules/babel-register/lib/node.js:154:7)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/Leaf/Downloads/mirror-web-isomorphic-master/platforms/server/routes/a
pi.js:4:1)
at Module._compile (module.js:541:32)
at loader (/Users/Leaf/Downloads/mirror-web-isomorphic-master/node_modules/babel-register/lib/node.
js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (/Users/Leaf/Downloads/mirror-web-isomor
phic-master/node_modules/babel-register/lib/node.js:154:7)
zhuscat commented
经过研究发现是因为 mongoose 会自己对 model 和 schema 进行缓存,需要在每次文件发生变动的时候清除这个缓存:
Object.keys(mongoose.models).forEach(function(model) {
delete mongoose.models[model];
})
Object.keys(mongoose.modelSchemas).forEach(function(schema) {
delete mongoose.modelSchemas[schema];
})
wssgcg1213 commented
棒!这个缓存是个黑盒逻辑,很容易遇到坑 感谢提出来