6

I am working with the Loopback Framework, doing a web project. But I think that the question that I am exposing here has less to do with this, but with general Javascript / Node.JS knowledge.

At one part of the code, I am doing:

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);
            }
        }
});

Ok with this, but it fails when trying to compare roles[i].role.name. So, I went logging what the roles[i] object contained.

    { 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 } }

Ok, nothing wrong, but it still fails, so I tried to print just the role property. And to my surprise:

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

So, the role property seems to be some sort of function? But how it was been correctly printed before?

Eventually, lost in my frustration I tried var role = JSON.parse(JSON.stringify(roles[i]));

And then I could access every property of the object normally, but this is not clean nor normal.

This blew my mind for the first time in years of JS programming (sort of amateurish though), and I would be pleased if someone could clarify this to me. Thanks

EDIT: It seems that it is specific to this Framework, so I'm changing title to help community.

8
  • Can you show us the code you used to print them? Commented Jun 18, 2015 at 22:58
  • console.log(roles[i]); printing whole object ok, and console.log(roles[i].role) printing the weird thing. Commented Jun 18, 2015 at 23:01
  • I think I've seen mongodb doing similar weird things. Does roles[i] have a .toJSON method? Commented Jun 18, 2015 at 23:15
  • Yeah it looks like you need to extract the actual value (your object) somehow. It also looks like the logged object might in fact be a function. Does roles[i]() return anything? Commented Jun 18, 2015 at 23:19
  • Thay may have something to do with the behaviour of the for (... in ...) loop. You could try using for (var i = 0, length = roles.length; i < length; i++) { <your code here> } instead. See developer.mozilla.org/en/docs/Web/JavaScript/Reference/… Commented Jun 18, 2015 at 23:20

1 Answer 1

10

I just found issue 1425 which links to the following docs:

With Node.js API, you need to call toJSON() to convert the returned model instance with related items into a plain JSON object

Please note the relation properties […] points to a JavaScript function for the relation method.

So it seems you have to use

for (var i=0; i<roles.length; i++) {
    var x = roles[i].toJSON();
    cb(null, x.role.name === 'teamLeader'
             && x.groupId === context.modelId);
}
Sign up to request clarification or add additional context in comments.

2 Comments

Yeah, I have the same tab open right now, but I missed that section. Thanks, and sorry ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.