如果我让mocha注意更改,每次保存文件mongoose都会抛出以下错误: OverwriteModelError: Cannot overwrite Client model once compiled 我知道猫鼬不允许两次定义模型,但我不知道如何使用mocha –watch. // cl
OverwriteModelError: Cannot overwrite
Client
model once compiled
我知道猫鼬不允许两次定义模型,但我不知道如何使用mocha –watch.
// client.js var mongoose = require('mongoose'); var Schema = mongoose.Schema; var clientSchema = new Schema({ secret: { type: String, required: true, unique: true }, name: String, description: String, grant_types: [String], created_at: { type: Date, default: Date.now } }); module.exports = mongoose.model('Client', clientSchema);
这是测试
// client-test.js var chai = require('chai'); var chaiHttp = require('chai-http'); var mongoose = require('mongoose'); var server = require('../../app'); var Client = require('../../auth/models').Client; var should = chai.should(); chai.use(chaiHttp); describe('client endpoints', function() { after(function(done) { mongoose.connection.close(); done(); }); it('should get a single client on /auth/client/{clientId} GET', function(done) { var clt = new Client({ name: 'my app name', description: 'super usefull and nice app', grant_types: ['password', 'refresh_token'] }); clt.save(function(err) { chai.request(server) .get('/auth/client/' + clt._id.toString()) .end(function(err, res) { res.should.have.status(200); res.should.be.json; res.body.should.have.property('client_id'); res.body.should.not.have.property('secret'); res.body.should.have.property('name'); res.body.should.have.property('description'); done(); }); }); }); });我遇到过同样的问题.我的解决方案是检查模型是否已创建/编译,如果没有,则执行此操作,否则只需检索模型.
使用mongoose.modelNames(),您可以获得模型名称的数组.然后使用.indexOf检查要获取的模型是否在数组中.如果不是,那么编译模型,例如:mongoose.model(“User”,UserSchema),但如果它已经定义(如mocha –watch的情况),只需检索模型(不要再次编译),你可以使用例如:mongoose.connection.model(“User”).
这是一个函数,它返回一个函数来执行这个检查逻辑,它自己返回模型(通过编译它或只是检索它).
const mongoose = require("mongoose"); //returns a function which returns either a compiled model, or a precompiled model //s is a String for the model name e.g. "User", and model is the mongoose Schema function getModel(s, model) { return function() { return mongoose.modelNames().indexOf(s) === -1 ? mongoose.model(s, model) : mongoose.connection.model(s); }; } module.exports = getModel;
这意味着你必须要求你的模型有点不同,因为你可能会更换这样的东西:
module.exports = mongoose.model("User", UserSchema);
返回模型本身,
有了这个:
module.exports = getModel("User", UserSchema);
它返回一个函数来返回模型,通过编译它或只是检索它.这意味着当您需要“用户”模型时,您需要调用getModel返回的函数:
const UserModel = require("./models/UserModel")();
我希望这有帮助.