【问题标题】:OverwriteModelError: Cannot overwrite `actors` model once compiledOverwriteModelError:一旦编译就无法覆盖`actors`模型
【发布时间】:2019-08-31 16:46:52
【问题描述】:

这是我的演员模型。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ActorSchema = new Schema({
    name: {
        type:String,
        required:true,
        minlength: [3, 'Actor Name must be at least 3 characters.'],
    },
    imdb_url:{
        type:String,
        required:true,
    }
});

module.exports = mongoose.model('actors', ActorSchema);

这是我的测试文件。

const request = require('supertest')
const Actor = require('../../models/actor')
let server;

describe('/actors', () => {
    beforeEach( () => { server = require('../../app');    });
    afterEach( () => { server.close() });
    describe('GET /', () =>{
        it("should return all actors", async () => {
            const res  = await request(server).get('/admin/actors');
            expect(1).toBe(1);
        })
    })
})

所以,在一个测试文件中,我得到了这个:require('../../app');,它执行app.js 代码,它有这行require("./startup/routes")(app),在路由中,我需要模型。

运行 npm test 后,它说:

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

我该如何解决这个问题?

我知道 Actor 模型的 require 发生了两次,但是由于模块缓存,Actor 模型模块必须只执行一次,但我猜它会执行两次。

【问题讨论】:

    标签: node.js express jestjs


    【解决方案1】:

    您的模型需要两次,因此会出现错误。

    从测试用例中删除这一行。

    const Actor = require('../../models/actor');

    只有应用程序应该在您启动服务器时立即调用模型。

    假设你已经在 app.js 中包含了模型

    this.actorModel = require('../../models/actor');

    访问模型如

    你的测试用例中的app.actorModel。

    我认为只要您需要,此代码就会运行:

    mongoose.model('actors', ActorSchema);

    因此没有模块缓存将起作用。

    【讨论】:

    • 1) 为什么模块缓存不起作用? 2)我需要在测试文件中使用这个模型,以便我可以将东西初始放入数据库
    • 我成功了。错误是错字(../../models/Actor'')。而不是演员。顺便说一句,你知道这个错误在说什么吗:这通常意味着在你的测试中没有停止异步操作。考虑使用 --detectOpenHandles 运行 Jest 来解决此问题。
    • request(server).get('/admin/actors') 是否返回承诺?
    猜你喜欢
    • 2013-01-16
    • 2015-04-25
    • 2017-10-04
    • 2022-08-21
    • 2020-03-06
    • 2020-11-13
    • 2019-02-28
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多