I have learned promise chaining with error handling to my satisfaction as per below first code section. But I am unable to get the following principle working with my Parse Cloud Code. My Cloud code works well but I have monster functions I need to refactor and organize.
My goal here
Is to have smaller cloud functions I can call without repeating code, as such, I want to have a function to trip an error if a user already is part of a group Parse.Role, otherwise I will add user to Role. Of course if error trips I want to stop the rest of the execution.
Please see second code snippets. I would appreciate some professional input.
function addOne(number) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(number += 1);
}, 1000);
});
}
/// Throws error unless number is 5
var test = addOne(5);
test.then(function(currentValue) {
currentValue ++;
if (currentValue > 7) {
return Promise.reject(Error("Initial value too high"));
} else {
return Promise.resolve(currentValue);
}
})
.then(function(value) {
value -= 2;
if (value < 5) {
return Promise.reject(Error("Initial value too low"));
} else {
return Promise.resolve(value);
}
})
.then(function(finalValue) {
finalValue ++;
if (finalValue != 6) {
return Promise.reject(Error("Not the sweet spot"));
} else {
console.log("You choose RIGHT!" + String(Promise.resolve("TEST")));
}
});
/// THIS IS ONE VERSION - NOT WORKING PROPERLY
/// Check if user is part of group
Parse.Cloud.define("mmDoesUserHaveGroup", async function(request) {
let userID = request.params.user;
// Search user class by user id parameter
let userQuery = await new Parse.Query(Parse.User).equalTo('objectId', userID).find({useMasterKey: true});
let userObject = userQuery[0];
// Check for user in all Roles
const query = await new Parse.Query(Parse.Role).equalTo('users', userObject).find({ useMasterKey: true })
.then(function() {
if (query.length != 0) {
return Promise.reject(Error('User is part of group already'));
} else {
return Promise.resolve();
}
});
});
Parse.Cloud.define("ccCreateGroup", async function(request) {
let userID = request.user.id;
const doesUserHaveGroup = Parse.Cloud.run("mmDoesUserHaveGroup", {user: userID});
doesUserHaveGroup
.then(function() {
return Promise.resolve("Create group action next");
})
.catch(error => Error(error.message));
});
/// ANOTHER VERSION - NOT WORKING EITHER
/// Returns false if user is not part of group or does not own group else error
Parse.Cloud.define("mmDoesUserHaveGroup", async function(request) {
let userID = request.params.user;
// Search user class by user id parameter
let userQuery = await new Parse.Query(Parse.User).equalTo('objectId', userID).find({useMasterKey: true});
let userObject = userQuery[0];
// Check for user in all Roles
const query = await new Parse.Query(Parse.Role).equalTo('users', userObject).find({ useMasterKey: true })
.then(function() {
if (query.length != 0) {
return true;
} else {
return false;
}
});
});
Parse.Cloud.define("ccCreateGroup", async function(request) {
let userID = request.user.id;
const doesUserHaveGroup = Parse.Cloud.run("mmDoesUserHaveGroup", {user: userID});
doesUserHaveGroup
.then(function(groupStatus) {
if (groupStatus) {
return Promise.reject(Error("User already has group"));
} else {
return Promise.resolve("Create group action next");
}
});
});
Even though I have no experience with Parse, judging only from syntax, I suppose that your problem lies is this section here:.
Notice that as a general advice, it's not a good practice to mix Promise syntax with
awaitunless you really know what you're doing.In your case, inside the
thenpart you are expecting thatqueryis already set, which it won't be, sinceawaitis still, err, awaiting for the Promise to resolve (or at least that's what it seems to me).What you probably want is something like this: