Mongo 架构 - MongoMocha 测试时出现错误(MissingSchemaError 和 OverwriteModelError)
Mongo Schemas - Mongoose error when Mocha Testing (MissingSchemaError and OverwriteModelError)
编辑 - 看来我在这里遇到了两个问题。我接受了下面给出的答案,但请阅读评论,因为 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
});
};
我有摩卡运行宁一些测试。但是当我 运行 测试时我得到一个错误
MissingSchemaError: Schema hasn't been registered for model "Store".
阅读此 我可以将我的 storyController 修改为
const mongoose = require('mongoose');
mongoose.model('Story', new mongoose.Schema());
const Story = mongoose.model('Story')
这让 Mocha 很开心,但随后 nodemon 出现错误
OverwriteModelError: Cannot overwrite
故事model once compiled.
环顾四周 似乎可以解决这个问题,但据我所知,我正在使用这种方法(我使用 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}`);
});
您应该使用以下语法导入 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');
,您将创建一个没有架构定义的 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 集合的模式定义模型
编辑 - 看来我在这里遇到了两个问题。我接受了下面给出的答案,但请阅读评论,因为 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
});
};
我有摩卡运行宁一些测试。但是当我 运行 测试时我得到一个错误
MissingSchemaError: Schema hasn't been registered for model "Store".
阅读此 我可以将我的 storyController 修改为
const mongoose = require('mongoose');
mongoose.model('Story', new mongoose.Schema());
const Story = mongoose.model('Story')
这让 Mocha 很开心,但随后 nodemon 出现错误
OverwriteModelError: Cannot overwrite
故事model once compiled.
环顾四周 似乎可以解决这个问题,但据我所知,我正在使用这种方法(我使用 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}`);
});
您应该使用以下语法导入 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');
,您将创建一个没有架构定义的 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 集合的模式定义模型