【问题标题】:Mongo Schemas - Mongoose error when Mocha Testing (MissingSchemaError and OverwriteModelError)Mongo Schemas - Mocha 测试时出现 Mongoose 错误(MissingSchemaError 和 OverwriteModelError)
【发布时间】:2018-01-16 18:27:23
【问题描述】:

编辑 - 看来我在这里遇到了两个问题。我已接受下面给出的答案,但请阅读 cmets,因为 mocha -w 问题在修复中同样重要。

我已经阅读了一些关于此的 SO 问题和答案,并尝试了一些建议的方法,但我仍然无法解决此问题,所以我希望有人可以帮助我:

我有一个模型:

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const slug = require('slugs');

const storySchema = new mongoose.Schema({
  name :{
    type: String,
    trim: true,
    required: 'Please enter a store name'
},
  slug: String,
  storyText: {
    type: String,
    trim:true
},
  keyStageLevel: [String]
});


module.exports = mongoose.model('Story', storySchema);

还有一个故事控制器:

const mongoose = require('mongoose');
const Story = mongoose.model('Story');

exports.storyHomePage = (req, res) => {
console.log(req.name);
res.render('story', {
    title:"Reading Project = Story Home Page",
    created:req.query.created

  });
};

我让 mocha 运行了一些测试。但是,当我运行测试时,我得到一个错误

MissingSchemaError: Schema hasn't been registered for model "Store".

阅读此https://stackoverflow.com/a/21915511/1699434 我可以将我的storyController 修改为

const mongoose = require('mongoose');

mongoose.model('Story', new mongoose.Schema());

const Story = mongoose.model('Story')

这让 Mocha 很开心,但随后 nodemon 因错误而崩溃

OverwriteModelError: Cannot overwriteStorymodel once compiled.

环顾这个https://stackoverflow.com/a/19051909/1699434 似乎是解决这个问题的方法,但据我所知,我正在使用这种方法(我使用const Store = mongoose.model('Store'); 而不是const Store = require('../models/Store')

所以我有点卡住了。非常感谢任何帮助!

编辑以包含 start.js

const mongoose = require('mongoose');


// import environmental variables from our variables.env file
require('dotenv').config({ path: 'variables.env' });

// Connect to our Database and handle any bad connections
mongoose.connect(process.env.DATABASE);
mongoose.Promise = global.Promise; // Tell Mongoose to use ES6 promises
mongoose.connection.on('error', (err) => {
  console.error(`${err.message}`);
});

//import all of the models
require('./models/Story');

// Start app
const app = require('./app');
app.set('port', process.env.PORT || 7777);
const server = app.listen(app.get('port'), () => {
console.log(`Express running → PORT ${server.address().port}`);
});

【问题讨论】:

    标签: mongodb express mocha.js mongoose-schema


    【解决方案1】:

    您应该使用以下语法导入 Story 模型,并且无需再次导入 mongoose 模块:

    // I suppose the file is located in 'models' folder and the current folder is 'controllers'
    const Story = require('../models/story');
    

    通过const Story = mongoose.model('Story');,您正在创建一个没有模式定义的故事模型,这就是您获得Schema hasn't been registered for model "Store". 的原因

    在你的第二个例子中:

    // this create a new model from an empty schema (schema without fields)
    mongoose.model('Story', new mongoose.Schema());
    
    // overwriting the first model which is not allowed by mongoose
    const Story = mongoose.model('Story')
    

    请记住,mongoose.model() 方法仅从映射到 MongoDB 集合的模式定义模型

    【讨论】:

    • 非常感谢您的快速回复。因此,我将控制器更改为 const Story = require('../models/Story');,但测试仍然会在编译后抛出 OverwriteModelError: Cannot overwrite Story 模型。`
    • 我想你可能忘记在控制器或导入的模块中删除这一行 mongoose.model('Story', new mongoose.Schema());mongoose.model('Story');,它应该只在架构定义中出现一次
    • 谢谢 YouneL :)。我有一个 start.js 文件(我编辑了上面的问题以显示它),它也导入了模型。如果我在 start.js 中注释掉 require('./models/Story'); 并且只有 const Story = require('../models/Story'); 那么 Nodemon 很高兴,但 Mocha 抱怨 OverwriteModelError: Cannot overwrite Story 模型一旦编译。`
    • 也许你应该从start.js 中删除这行require('./models/Story');,并在storyController 中只保留这个:const Story = require('../models/story'); 并删除所有mongoose.model(...)
    • 还有一件事,在Mocha中也用require('..')替换mongoose.model(...)
    猜你喜欢
    • 2013-08-12
    • 2020-04-26
    • 2017-08-21
    • 1970-01-01
    • 2015-05-11
    • 2016-02-23
    • 2015-11-23
    • 2017-06-10
    • 2021-04-15
    相关资源
    最近更新 更多