代码之家  ›  专栏  ›  技术社区  ›  GeraltDieSocke

当我第二次运行测试时,为什么在Mongoose中会出现“cannot overwrite model once compiled”错误?

  •  0
  • GeraltDieSocke  · 技术社区  · 7 年前

    我读过相关文章: cannot overwrite model once compiled mongoose

    问题是这些解决方案对我的问题都没有帮助。

    我得到了标题中的错误,并进行了以下设置:

    文件夹结构:

    我的模型如下:

    < Buff行情>

    论坛.js

    < /块引用>
    const mongoose=require(“mongoose”);
    const-schema=mongoose.schema;
    const topicgroupschema=需要(“./topicgroups”);
    
    const forumschema=新架构({
    标题:字符串,
    TopicGroups:[TopicGroupSchema]
    })
    
    const forum=mongoose.model(“论坛”,forumschema);
    
    module.exports=论坛;
    < /代码> 
    
    < Buff行情>
    

    主题组.js

    < /块引用>
    const mongoose=require(“mongoose”);
    const-schema=mongoose.schema;
    
    const topicgroupschema=新架构({
    标题:字符串,
    //TODO:添加主题
    })
    
    module.exports=topicGroupSchema;
    < /代码> 
    
    

    我的test_helper和saveforum_test.js文件如下所示:

    < Buff行情>

    saveforum测试.js

    < /块引用>
    const assert=require(“assert”);
    const forum=要求(“../model/forums”)
    
    描述(“正在创建记录”,()=>。{
    它(“可以保存新论坛”,(完成)=>。{
    const forum=新论坛({
    标题:“codehub”
    })
    Savee()
    。然后(()=>){
    断言(forum.isnew)
    DONE();
    })
    })
    })
    
    < Buff行情>
    

    测试助手.js

    < /块引用>
    const mongoose=require(“mongoose”);
    mongoose.promise=global.promise;
    
    之前(完成=>){
    mongoose.connect(“mongodb://myuser:mypassword@ds221339.mlab.com:21339/clicker”,usenewurlparser:true);
    Mongoose.连接
    .ONCE(“打开”,(>完成())
    .on(“错误”,错误=>){
    console.warn(“错误”,错误)
    })
    })
    
    //Fixme:保存两次时出错
    
    每次之前(完成=>){
    console.log(mongoose.connection.collections.forums)
    mongoose.connection.dropcollection(“论坛”,()=>){
    DONE();
    })
    })
    < /代码> 
    
    

    所以当我用Mocha运行我的测试套件时,一切都按预期工作。 但是,当我更改某个内容并再次运行它时,我会得到错误

    < Buff行情>

    overwriteModelError:cannot overwriteforums.model once compiled.

    < /块引用>

    我将MLAB与Mongoose一起使用,而不是本地安装的MongoDB。也许有什么关系?我想不出来,我检查了所有的文件和导入文件等10次,没有发现错误,是吗?

    问题是这些解决方案对我的问题都没有帮助。

    我得到了标题中的错误,并进行了以下设置:

    文件夹结构:

    enter image description here

    我的模型如下:

    福尔摩斯

    const mongoose = require("mongoose");
    const Schema = mongoose.Schema;
    const topicGroupSchema = require("./topicGroups");
    
    const forumSchema = new Schema({
        title: String,
        topicGroups: [topicGroupSchema]
    })
    
    const Forum = mongoose.model("forums", forumSchema);
    
    module.exports = Forum;
    

    专题小组

    const mongoose = require("mongoose");
    const Schema = mongoose.Schema;
    
    const topicGroupSchema = new Schema({
        title: String,
       // Todo: add topics
    })
    
    module.exports = topicGroupSchema;
    

    我的test_helper和saveforum_test.js文件如下:

    saveforum测试.js

    const assert = require("assert");
    const Forum = require("../model/forums")
    
    describe("Creating records", () => {
        it("can save a new forum", (done) => {
            const forum = new Forum({
                title: "CodeHUB"
            })
            forum.save()
                .then(() => {
                    assert(forum.isNew)
                    done();
                })
        })
    })
    

    TestyHelp.js

    const mongoose = require("mongoose");
    mongoose.Promise = global.Promise;
    
    before(done => {
        mongoose.connect("mongodb://myuser:mypassword@ds221339.mlab.com:21339/clicker", { useNewUrlParser: true });
        mongoose.connection
            .once("open", () => {done()})
            .on("error", error => {
                console.warn("error", error)
            })
    })
    
    // FIXME: error when saved twice
    
    beforeEach(done => {
        console.log(mongoose.connection.collections.forums)
        mongoose.connection.dropCollection("forums", () => {
            done();
        })
    })
    

    所以当我用Mocha运行我的测试套件时,一切都按预期工作。 但是,当我更改某个内容并再次运行它时,我会得到错误

    overwriteModelError:无法覆盖forums模型一经编译。

    我将MLAB与Mongoose一起使用,而不是本地安装的MongoDB。也许有什么关系?我想不出来,我检查了所有的文件和导入文件等10次,没有发现错误,是吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   GeraltDieSocke    7 年前

    我已经解决了这个问题。

    结果发现问题在于我是如何运行我的测试套件的。 我的 npm run test 命令在 package.json 是否执行了以下操作:

    "test": "mocha --watch"

    这是错误。我想 --watch 并没有重新验证所有东西,就像“热模块更换”。

    我安装 nodemon 并像这样更改了我的测试脚本:

    "test": "nodemon --exec \"mocha -R min\""

    这可以确保重新运行整个文件,并且不会显示任何错误。

    另一个应该工作的相关职位: mocha --watch and mongoose models