我们使用继承的模式和Mongoose的鉴别器功能,我们根据documentation实现。
通过我们的REST API,我们想要POST
不同类型的文档,并使用通用控制器函数处理逻辑。
假设我们有一个用于创建文档的REST方法,该方法可以是超类型GenericEvent
,也可以是子类型ClickedLinkEvent
或SignedUpEvent
(以跟随示例中的示例)上面链接的文档)。我目前正在做的事情是:
var GenericEventModel = require('GenericEventModel');
var ClickedLinkEventModel = require('ClickedLinkEvent');
var SignedUpEventModel = require('SignedUpEvent');
// REST logic for creating a document of a specific type
module.exports.createEvent = function(req, res, next) {
var modelType = req.params.type; // as provided via REST parameter
var Model = getModel(modelType); // get the appropriate model type
new Model(req.body).save(next);
}
// TODO want to avoid this
function getMongooseModel(type) {
switch (modelType) {
case 'GenericEvent': return GenericEventModel;
case 'ClickedLinkEvent': return ClickedLinkEventModel;
case 'SignedUpEvent': return SignedUpEventModel;
// and many more, needs to be extended, every time a new type is added …
}
}
每当添加新的模型类型时,必须手动策划getMongooseModel
函数似乎容易出错,并且我怀疑其他将要编写代码的人会忘记它。
所以,我的问题:Mongoose API中是否存在一个函数,通过查看所有已知的子模式,可以为给定的鉴别器密钥提供合适的模型?
答案 0 :(得分:1)
更好的实现应该是使用对象而不是开关。
var modelMap = {
'GenericEvent': GenericEventModel,
'ClickedLinkEvent': ClickedLinkEventModel,
'SignedUpEvent': SignedUpEventModel
};
function getMongooseModel(type) {
return modelList[type];
}
之后为了避免错误,您可以使用Mongoose#plugin(fn, [opts])来填充modelMap
对象。
或者您可以使用Mongoose#model(name, [schema], [collection], [skipInit])。
定义模型或检索模型。
这样的事情应该有效:
module.exports.createEvent = function(req, res, next) {
var Model = mongoose.model(req.params.type);
(new Model(req.body)).save(next);
}
在mongoose中正确声明您的模型类,模型名称当然必须与您的请求参数匹配。
var GenericEventModel = mongoose.model('GenericEvent', GenericEventModelSchema);