Sails Js:动态表名称在模型中

时间:2013-08-01 19:32:10

标签: node.js sails.js

我正在构建我的第一个sailsjs和nodejs应用程序,它很棒:)

我的情况,我有大约100张具有相同结构的表格,我想决定“在运行中”加载哪个表格。

我的第一个想法是以某种方式使用动态类名。但是我不知道如何用nodejs做这个,也许有些人有想法。

所以我会在我的模型文件夹中创建100个“modelName”.js文件。

我可以在浏览器中使用它

window["fileName"].find()....

但我在nodejs中没有任何窗口对象

第二个想法是将tableName传递给模型,问题是,我必须重新启动模型,不知道如何。

任何解决方案?

4 个答案:

答案 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()....