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