当我第二次运行测试时,为什么在 Mongoose 中出现错误“编译后无法覆盖模型”?

Ger*_*cke 1 mocha.js mongoose mongodb node.js

我已阅读相关帖子:一旦编译 Mongoose,就无法覆盖模型

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

我收到标题中的错误,我有以下设置:

文件夹结构:

在此处输入图片说明

我的模型看起来像这样:

论坛.js

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;
Run Code Online (Sandbox Code Playgroud)

主题组.js

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const topicGroupSchema = new Schema({
    title: String,
   // Todo: add topics
})

module.exports = topicGroupSchema;
Run Code Online (Sandbox Code Playgroud)

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

saveForum_test.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();
            })
    })
})
Run Code Online (Sandbox Code Playgroud)

test_helper.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();
    })
})
Run Code Online (Sandbox Code Playgroud)

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

OverwriteModelError:forums编译后无法覆盖模型。

我将 mlab 与 mongoose 一起使用,而不是本地安装的 mongodb。也许它与此有关?我想不通,我检查了所有文件和导入等 10 次,但没有发现错误,你能吗?

小智 10

当我导出模型时,我解决了这个问题。

return mongoose.models[modelName] 
    ? mongoose.model(modelName)
    : mongoose.model(modelName, modelSchema)
Run Code Online (Sandbox Code Playgroud)

  • 对于热重载来说确实如此,尤其是对于 NextJS。 (3认同)

Ger*_*cke 5

我已经解决了这个问题。

原来问题是我如何运行我的测试套件。我的npm run test命令执行package.json了以下操作:

"test": "mocha --watch"

这是错误。我认为--watch不会重新实例化所有内容,就像“热模块更换”一样。

我安装nodemon并更改了我的测试脚本,如下所示:

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

这确保重新运行整个文件并且没有出现错误。

另一个应该起作用的相关帖子:mocha --watch and mongoose models