wssgcg1213/koa2-react-isomorphic-boilerplate

Development 模式下修改文件 Mongoose 出错

zhuscat opened this issue · 2 comments

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)

@wssgcg1213

经过研究发现是因为 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];
})

棒!这个缓存是个黑盒逻辑,很容易遇到坑 感谢提出来