Not getting UID from Moralis Cloud Function

Hi,

I have this Cloud Function to get User and their related Role data, but i don’t het the UID column send to requester…
Server: https://1bxtbthptjkt.moralis.io:2053/server

Moralis.Cloud.define("getAllUsersRoles", async (request) => {
  const logger = Moralis.Cloud.getLogger();
  
  const queryUsers = new Moralis.Query(Moralis.User);
  queryUsers.select("uid", "username", "email", "avatar", "ethAddress");
  const queryUsersResults = await queryUsers.find({useMasterKey:true});
  logger.info("Users: " +JSON.stringify(queryUsersResults) );

  const results = [];
  let queryRoles, roles, queryRolesResults;
  for (let i = 0; i < queryUsersResults.length; ++i) {
    //logger.info("User: " + JSON.stringify(queryUsersResults[i]) );
    //logger.info("User: " + queryUsersResults[i].attributes.uid);
                
    queryRoles = new Moralis.Query(Moralis.Role);
    queryRoles.select("name");
    queryRoles.equalTo("users", queryUsersResults[i]);
    queryRolesResults = await queryRoles.find();

    roles = [];
    if (queryRolesResults.length > 0) {
      for (let j = 0; j < queryRolesResults.length; j++) {
        //logger.info("Roles: " +JSON.stringify(queryRolesResults[j]) );
        roles.push(queryRolesResults[j].attributes.name);
      }      
    }

    results.push({
      "userid": queryUsersResults[i].attributes.uid,
      "username": queryUsersResults[i].attributes.username,
      "email": queryUsersResults[i].attributes.email,
      "avatar": queryUsersResults[i].attributes.avatar,
      "ethAddress": queryUsersResults[i].attributes.ethAddress,
      "roles": roles.join(",")
    });
  }
  return results;
});

Output in Dashboard log-Info:


=> Here it is as “objectId”:“M7FC1EmtVPGBjCf8KUivaIbb” at end of a ‘row’ available. I know (mongoDB) that is to be read as “uid”.
But even: “userid”: queryUsersResults[i].attributes.objectId, does not show userid in output.

Output in browser Console:

So: “userid” field is not present in returned output, other fields do.
Why??

have you tried .get("id")?

Tested, and several variations, but not in returned results…

If I do: “userid”: queryUsersResults[i].attributes.username,
then the userid with the username is in the results.
Seems the uid or _id or objectId is not defined when pushed…?!

Can not understand.

In another function, lower in this Cloud Functions collection (from the video serie) it works perfect:

  Moralis.Cloud.define("getItems", async (request) => {
    const query = new Moralis.Query("ItemsForSale");
    query.notEqualTo("isSold", true);
    query.select("uid","askingPrice","tokenAddress","tokenId", "token.token_uri", "token.symbol","token.owner_of","token.id", "user.avatar","user.username");

    const queryResults = await query.find({useMasterKey:true});
 
    var tokenExist, userExist;
    const results = [];
    for (let i = 0; i < queryResults.length; ++i) {
  
      //if (!queryResults[i].attributes.token || !queryResults[i].attributes.user) continue;
  
      tokenExist = (typeof queryResults[i].attributes.token !== 'undefined');
      userExist = (typeof queryResults[i].attributes.user !== 'undefined');
      results.push({
        "uid": queryResults[i].attributes.uid,
        "tokenId": queryResults[i].attributes.tokenId,
        "tokenAddress": queryResults[i].attributes.tokenAddress,
        "askingPrice": queryResults[i].attributes.askingPrice,
  
        "symbol": (tokenExist ? queryResults[i].attributes.token.attributes.symbol : ''),
        "tokenUri": (tokenExist ? queryResults[i].attributes.token.attributes.token_uri : ''),
        "ownerOf": (tokenExist ? queryResults[i].attributes.token.attributes.owner_of : ''),
        "tokenObjectId": (tokenExist ? queryResults[i].attributes.token.id : ''),
        
        "sellerUsername": (userExist ? queryResults[i].attributes.user.attributes.username : ''),
        "sellerAvatar": (userExist ? queryResults[i].attributes.user.attributes.avatar : ''),
      });
    }
  
    return results;
  });

Here the “uid” is nicely returned, but is NOT the objectId : uid is a normal seperate field (!)

Thus: how to get the objectId field in results ?

Solution !

The objectId seems to be available in a JSON.stringify() and not as attributes, so my solution became…
(also for avatar to only get its url , if existing !)

Moralis.Cloud.define("getAllUsersRoles", async (request) => {
  //const logger = Moralis.Cloud.getLogger();
  
  const queryUsers = new Moralis.Query(Moralis.User);
  const queryUsersResults = await queryUsers.find({useMasterKey:true});

  const results = [];
  let queryRoles, roles, queryRolesResults;
  for (let i = 0; i < queryUsersResults.length; ++i) {
    //logger.info("User: " + JSON.stringify(queryUsersResults[i]) );
    //logger.info("User: " + queryUsersResults[i].attributes.uid);
                
    queryRoles = new Moralis.Query(Moralis.Role);
    queryRoles.select("name");
    queryRoles.equalTo("users", queryUsersResults[i]);
    queryRolesResults = await queryRoles.find();

    roles = [];
    if (queryRolesResults.length > 0) {
      for (let j = 0; j < queryRolesResults.length; j++) {
        //logger.info("Roles: " +JSON.stringify(queryRolesResults[j]) );
        roles.push(queryRolesResults[j].attributes.name);
      }      
    }

    // 'trick' to get objectId , not available as attributes
    const userResults = JSON.parse(JSON.stringify(queryUsersResults[i]));
    results.push({
      "userid": userResults.objectId,
      "username": userResults.username,
      "email": userResults.email,
      "avatarUrl": (userResults.avatar ? JSON.parse(JSON.stringify(userResults.avatar)).url : ''),
      "ethAddress": userResults.ethAddress,
      "roles": roles.join(",")
    });    
  }
  return results;
});
2 Likes