我正在构建我的第一个sailsjs和nodejs应用程序,它很棒:)
我的情况,我有大约100张具有相同结构的表格,我想决定“在运行中”加载哪个表格。
我的第一个想法是以某种方式使用动态类名。但是我不知道如何用nodejs做这个,也许有些人有想法。
所以我会在我的模型文件夹中创建100个“modelName”.js文件。
我可以在浏览器中使用它
window["fileName"].find()....
但我在nodejs中没有任何窗口对象
第二个想法是将tableName传递给模型,问题是,我必须重新启动模型,不知道如何。
任何解决方案?
答案 0 :(得分:2)
找到解决方案
var modelName = req.param('p');
this[modelName].find()...
答案 1 :(得分:1)
作者自己的答案是正确的,但我会为将来使用它的人添加一些内容 - 当您使用蓝图时,可以从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')
}
})
答案 2 :(得分:0)
替代方法:
sails.models[Model].findOne({...})
请确保将您的“型号”名称用小写字母表示为字符串。就像访问对象内部的属性一样
答案 3 :(得分:-4)
另一个对我有用的选择:
var modelName = "User";
global[modelName].find()....