【问题标题】:JS Object strange behaviour when trying access Loopback related model queryJS Object 尝试访问 Loopback 相关模型查询时的奇怪行为
【发布时间】:2015-06-18 22:49:09
【问题描述】:

我正在使用 Loopback 框架,做一个网络项目。 但我认为我在这里提出的问题与此无关,而是与一般的 Javascript / Node.JS 知识有关。

在代码的一部分,我正在做:

roleMapping.find({
        where: {
            principalType: 'USER',
            principalId: context.principals[0].id
        },
        include: 'role'
    }, function(err, roles){
        console.log(roles[0]);
        for (var i in roles)
        {
            if (roles[i].role.name === 'teamLeader' &&
                roles[i].groupId === context.modelId)
            {
                cb(null,true);
            }else {
                cb(null,false);
            }
        }
});

可以,但是在尝试比较 roles[i].role.name 时失败。 所以,我去记录 roles[i] 对象包含的内容。

    { groupId: 1,
  id: 3,
  principalType: 'USER',
  principalId: 1,
  roleId: 2,
  role: 
   { id: 2,
     name: 'teamLeader',
     description: 'The leader(s) of a team',
     created: null,
     modified: null } }

好的,没有错,但它仍然失败,所以我尝试只打印 role 属性。令我惊讶的是:

{ [Function]
  update: [Function],
  destroy: [Function],
  create: [Function],
  build: [Function],
  _targetClass: 'Role' }

那么,role 属性似乎是某种功能?但是之前是如何正确打印的呢?

最终,我在沮丧中迷失了方向,我尝试了var role = JSON.parse(JSON.stringify(roles[i]));

然后我可以正常访问对象的每个属性,但这不干净也不正常。

这是多年来 JS 编程中第一次让我大吃一惊(虽然有点业余),如果有人能向我澄清这一点,我会很高兴。谢谢

编辑:似乎它特定于这个框架,所以我正在更改标题以帮助社区。​​p>

【问题讨论】:

  • 你能告诉我们你用来打印它们的代码吗?
  • console.log(roles[i]); 打印整个对象正常,console.log(roles[i].role) 打印奇怪的东西。
  • 我想我见过 mongodb 做类似的奇怪的事情。 roles[i].toJSON 方法吗?
  • 是的,您似乎需要以某种方式提取实际值(您的对象)。看起来记录的对象实际上可能是一个函数。 roles[i]() 会返回什么吗?
  • Thay 可能与for (... in ...) 循环的行为有关。您可以尝试改用for (var i = 0, length = roles.length; i < length; i++) { <your code here> }。见developer.mozilla.org/en/docs/Web/JavaScript/Reference/…

标签: javascript node.js loopbackjs


【解决方案1】:

我刚刚找到issue 1425,它链接到以下docs

使用 Node.js API,您需要调用 toJSON() 将返回的带有相关项目的模型实例转换为纯 JSON 对象

请注意关系属性 […] 指向关系方法的 JavaScript 函数

看来你必须使用

for (var i=0; i<roles.length; i++) {
    var x = roles[i].toJSON();
    cb(null, x.role.name === 'teamLeader'
             && x.groupId === context.modelId);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多