Search code examples
node.jsloopback

user.login in loopback 3 not returning response


I've created a remote login method using the loopback user.login method. The functionality works well but I'm unable to send a response. The method completes itself before a response is sent. Here's my code:

user.js

async function findUserRole(userId) {
  return await userRole.find({
    where: {
      user_id: userId
    },
    include: {
      relation: 'role'
    },
  }).then(async function (res) {
    let isProvider = false;
    let isCustomer = false;
    let userResponse = JSON.parse(JSON.stringify(res));
    for (let index = 0; index < userResponse.length; index++) {
      if (userResponse[index].role.role_code === "CST") {
        isCustomer = true;
      } else if (userResponse[index].role.role_code === "PVI") {
        isProvider = true;
      }
    }

    if (isCustomer && isProvider) {
      console.log("here");
      return {code: 3, success: true, error: false, response: userObject, accessToken: accessToken};
    } else {
      if (isCustomer) {
        return {code: 1, success: true, error: false, response: userObject, accessToken: accessToken};
      } else if (isProvider) {
        return {code: 2, success: true, error: false, response: userObject, accessToken: accessToken};
      } else {
        return await user.logout(accessToken, function (err) {
          if (err)
            return {success: false, error: true, response: "No role found"};
        });
      }
    }

  }).catch(function (errorResponse) {
    return errorResponse.message;
  });
}
}; 

user.remoteMethod(
'loginUser', {
  http: {
    path: '/login-user',
    verb: 'post',
  },
  returns: {
    arg: 'Result',
    type: 'string',
  },
  accepts: [
    {arg: 'loginObject', type: 'object', http: {source: 'body'}}
  ]
}
);

I'm getting the right results when I console the data through the flow but always get an empty response, wherever I send it from the User.login method.


Solution

  • You should not be using async-await in the parent (main) remote method along with 'then', but use 'callback' along with the error or result object.

    Users.loginUser() = function (loginObject, callback) {
    userRole.find({
      where: {
        user_id: loginObject.userId
      },
      include: {
        relation: 'role'
      },
    }).then(async function (res) {
      let isProvider = false;
      let isCustomer = false;
      let userResponse = JSON.parse(JSON.stringify(res));
      for (let index = 0; index < userResponse.length; index++) {
        if (userResponse[index].role.role_code === "CST") {
          isCustomer = true;
        } else if (userResponse[index].role.role_code === "PVI") {
          isProvider = true;
        }
      }
      if (isCustomer && isProvider) {
        console.log("here");
        return callback(null, {
          code: 3,
          success: true,
          error: false,
          response: userObject,
          accessToken: accessToken
        });
      } else {
        if (isCustomer) {
          return callback(null, {
            code: 1,
            success: true,
            error: false,
            response: userObject,
            accessToken: accessToken
          });
        } else if (isProvider) {
          return callback(null, {
            code: 2,
            success: true,
            error: false,
            response: userObject,
            accessToken: accessToken
          });
        } else {
          return await user.logout(accessToken, function (err) {
            if (err)
              return callback({
                success: false,
                error: true,
                response: "No role found"
              });
          });
        }
      }
    })
    

    };