我正在构建我的第一个sailsjs和nodejs应用程序,它非常好:)
我的情况,我有大约100个具有相同结构的表,我想“即时”决定加载哪个表。
我的第一个想法是使用某种动态类名。但是我不知道如何用nodejs做到这一点,也许有人有一个主意。
所以我将在我的models文件夹中创建100个“ modelName” .js文件。
我可以在浏览器中使用它
window["fileName"].find()....
但是我在nodejs中没有任何窗口对象
第二个想法是将tableName传递给模型,问题是,我必须重新初始化模型,不知道如何。
任何解决方案?
找到解决方案
var modelName = req.param('p');
this[modelName].find()...
作者自己的答案是正确的,但是我将为将来使用它的人添加一些内容-使用蓝图时,您可以从modelName
中获得req.options.model
。
[不幸的是,您不能使用this[modelName]
,因为该选项为您提供以小写字母开头的型号名称,因此,首先您必须使用大写首字母,例如var modelName = req.options.model.charAt(0).toUpperCase() + req.options.model.slice(1);
然后您可以自由使用this[modelName].whateverYouNeed
我将其用于一般策略,以允许用户仅编辑自己的组元素。
var modelName = req.options.model.charAt(0).toUpperCase() + req.options.model.slice(1)
var elementID = null
if (req.params.id) { // To handle DELETE, PUT
elementID = req.params.id
}
if (req.body.id) { // To handle POST
elementID = req.body.id
}
this[modelName].findOne({
id: elementID
}).exec(function(err, contextElement) {
if(err) {
return res.serverError(err)
}
if(contextElement.group=== req.user.group.id) {
sails.log('accessing own: ' + modelName)
return next()
}
else {
return res.forbidden('Tried to access not owned object')
}
})
替代:
sails.models[Model].findOne({...})
请确保将您的“型号”名称用小写字母表示为字符串。就像访问对象内部的属性一样工作
另一个对我有用的选项:
var modelName = "User";
global[modelName].find()....