Is the following the correct way to go about things? This is a sign up controller action. Im creating a user and a group to add the user to. Notice I have method level variables
Is it ok to have the method level variables or will they be overriden by the another person signing up at the same time?
No, they won't as they are locally scoped to your postSignUp
function.
It is however a little ugly, nesting them might be the better choice here:
exports.postSignUp = function(req, res, next) {
return Q.invoke(exports, 'parseUser', req, null).then(function(user) {
return Q.invoke(exports, 'postCreateUser', user).then(function(createdUser) {
var group = new Group();
group.userIds = [user._id];
return Q.invoke(exports, 'postCreateGroup', group).then(function(createdGroup) {
user.groupId = group._id;
group.userIds = [ user._id ]; // repeat this?
return Q.ninvoke(req, 'login', user)
}).then(function(loggedInuser) {
return res.redirect('/tour');
}).fail(function(err) {
console.log('g:' + group);
throw err;
});
}).fail(function(err) {
console.log('u:' + user);
return exports.createValidationError(error, req, res, user);
});
}) // .fail(function(err) {
// … // parseUser or createValidationError failed
// });
};
Do I really need to break down all the different steps into different functions or can I just have 1 async function?
You have one async function currently, you might want to break that down into creating a user with a new group, and logging him in plus redirecting him to /tour
.