我在测试我的猫鼬模型时遇到问题
我有像
这样的结构两种模型用户和组织都需要知道模型地址。我的模型结构如下:
module.exports = function (mongoose, config) {
var organizationSchema = new mongoose.Schema({
name : {
type : String
},
addresses : {
type : [mongoose.model('Address')]
}
});
var Organization = mongoose.model('Organization', organizationSchema);
return Organization;
};
在我的普通应用程序中,我需要地址才能要求用户和组织,一切都很好。我现在为用户和组织编写测试。为了让地址模型注册我调用require('../models/Address.js')
如果我运行一个测试,这可以正常工作。但如果我批量运行所有测试,我会收到错误,因为我试图两次注册地址。
OverwriteModelError: Cannot overwrite Address model once compiled.
我如何解决这个问题?
答案 0 :(得分:13)
问题是你不能两次设置猫鼬模型。解决问题的最简单方法是利用node.js require
函数。
Node.js缓存对require
的所有调用,以防止您的模型初始化两次。但是你用模型包装你的模型。解开它们将解决您的问题:
var mongoose = require('mongoose');
var config = require('./config');
var organizationSchema = new mongoose.Schema({
name : {
type : String
},
addresses : {
type : [mongoose.model('Address')]
}
});
module.exports = mongoose.model('Organization', organizationSchema);
替代解决方案是确保每个模型仅初始化一次。例如,您可以在运行测试之前初始化所有模块:
Address = require('../models/Address.js');
User = require('../models/User.js');
Organization = require('../models/Organization.js');
// run your tests using Address, User and Organization
或者您可以在模型中添加try catch
语句来处理这种特殊情况:
module.exports = function (mongoose, config) {
var organizationSchema = new mongoose.Schema({
name : {
type : String
},
addresses : {
type : [mongoose.model('Address')]
}
});
try {
mongoose.model('Organization', organizationSchema);
} catch (error) {}
return mongoose.model('Organization');
};
更新:在我们的项目中,我们有/models/index.js
个文件来处理所有内容。首先,它调用mongoose.connect
来建立连接。然后它需要models
目录中的每个模型并创建它的字典。因此,当我们需要某个模型(例如user
)时,我们需要调用require('/models').user
。
答案 1 :(得分:3)
最佳解决方案(IMO):
try {
mongoose.model('config')
} catch (_) {
mongoose.model('config', schema)
}
答案 2 :(得分:1)
这个问题已经有了答案,但是以一种独特的方式来完成这项检查https://github.com/fbeshears/register_models。此示例项目使用register_models.js,其中包含文件名数组中的所有模型。它的效果非常好,您可以在任何需要的地方使用所有模型。请记住,node.js的缓存会在项目运行时缓存项目。
答案 3 :(得分:0)
我使用try / catch来解决这个问题,它运行正常。但我认为这不是最好的方法。
try{
var blog = mongoose.model('blog', Article);
} catch (error) {}
答案 4 :(得分:-1)