2

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

我的情况,我有大约 100 张具有相同结构的表,我想“即时”决定要加载哪个表。

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

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

我可以在浏览器中使用它

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

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

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

有什么解决办法吗?

4

4 回答 4

2

找到了解决方案

var modelName = req.param('p');
this[modelName].find()...
于 2013-08-01T19:51:07.287 回答
1

作者自己的回答是正确的,但我会为将来使用它的人添加一些内容 - 您可以modelNamereq.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')
    }
  })
于 2016-11-24T21:06:37.420 回答
0

替代:

sails.models[Model].findOne({...})

确保您的“模型”名称为小写字符串。它的工作方式类似于访问对象内部的属性

于 2019-10-16T16:56:46.917 回答
-5

另一个对我有用的选择:

var modelName = "User";
global[modelName].find()....
于 2017-01-18T23:57:12.090 回答