I am using parse javascript SDK, but when I try to handle user registration errors, such like username already taken, the error callback is not triggered.
The code I have is:
signUp: function () {
var self = this;
var errors = this.form.commit({ validate: true });
if(errors) return;
mainapp.showSpinner();
this.model.signUp({
success: function (user) {
console.log(user);
},
error: function (user, error) {
//mainapp.hideSpinner();
console.log('called')
self.errorMessage.html(error);
}
});
},
And the console.log('called) is not triggered, but in console of Chrome I have an javascript error POST https://api.parse.com/1/users 400 (Bad Request)
Any idea how can i catch and handle the error in the error callback?
By checking at the Parse JS sdk documentation, it seems like you miss one parameter when calling sign up function :
user.signUp(null, {
success: function(user) {
// Hooray! Let them use the app now.
},
error: function(user, error) {
// Show the error message somewhere and let the user try again.
alert("Error: " + error.code + " " + error.message);
}
});
https://parse.com/docs/js/guide#users-signing-up
Hope this could help to solve your problem.
Related
I'm doing my app users management with the Cognito AmazonWebService and on AngularJS.
I can not figure out how to solve this problem :
After registering, users are receiving an email with a code to confirm it. When I try to enter and validate the code I have a pop-up message saying "Error: the user is not authenticated".
But if is I swap the steps I can not authenticated myself because I've this error: "Your account must be confirmed".
EDIT: That's how I'm confirming the registration :
var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(_poolData);
var userData = {
Username : username,
Pool : userPool
};
var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
cognitoUser.getAttributeVerificationCode('email', {
onSuccess: function (result) {
console.log('call result: ' + result);
},
onFailure: function(err) {
console.log("error");
alert(err);
},
inputVerificationCode: function(code) {
var verificationCode = prompt('Check you email for a verification code and enter it here: ' ,'');
cognitoUser.verifyAttribute('email', verificationCode, this);
}
});
I have also try this code below :
var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
cognitoUser.confirmRegistration('123456', true, function(err, result) {
if (err) {
alert(err);
return;
}
console.log('call result: ' + result);
});
But everytime I'm using the code you gave me to confirm an user I have this error message : "ExpiredCodeException: Invalid code provided, please request a code again." while user is well confirmed in my user pool...
How could I solve it ?
Your second code is the right one to be called. How long are you waiting to call?
I want to add users to my Parse.Role but it's not working. I looked at a number of examples and they all seem pretty straight-forward however I'm unable to get it right. Here is my code:
Parse.Cloud.define("activateVendor", function(request, response){
var query = new Parse.Query(Parse.Role);
query.equalTo("name", "vendor");
query.first ({
success: function(role) {
role.getUsers().add(request.params);//request.params is the parse object, should I be using request.params.id?
role.save();
},
error: function(error) {
throw "Got an error " + error.code + " : " + error.message;
}
})
});
It depends on who you wish added to the role. The user who made the cloud request is available via the request object...
role.getUsers().add(request.user);
Otherwise, you can get a user via a query as #RobertRowntree suggests. (though, I'd suggest doing it with promises).
does what you want with 2 queries (Role, User) ...
var qu = new Parse.Query(Parse.User);
var qr = new Parse.Query(Parse.Role);
Parse.Cloud.useMasterKey();
qr.get(roleId, {
success: function(role) {
_role = role;
qu.get(userId, {
success: function(user) {
_role.getACL().setRoleReadAccess(_role, true);
_role.getUsers().add(user);
_role.save();
response.success(_role.toJSON());
},
error: function(object, error) {
}
});
},
error: function(object, error) {
}
});
My app is in the early development stage. I'm using the latest PhoneGap Build and Facebook Connect plugin. I managed to get the login working - you tap the Login With Facebook button, it switches to the Facebook app, Facebook passes my app an object with the basic login key/token & userID, and then my app tries to reach out for the user's full name and age.
I can't seem to get Facebook to give me any information other than the user's ID and full name. I need the user's age! For some reason, adding a projection isn't working... What's wrong with my code?
var fbLoginSuccess = function (userData) {
facebookConnectPlugin.getAccessToken(function(token) {
if(userData['status'] == 'connected'){
getBasicUserInfo_fb(userData);
}
}, function(err) {
alert("Could not get access token: " + err);
});
}
function getBasicUserInfo_fb(userData){
facebookConnectPlugin.api(userData['authResponse']['userID'] + "/?fields=id,birthday", ["user_birthday"], function (response) {
if (response && !response.error) {
alert("response: " + JSON.stringify(response));
console.log(response);
var user_name = response['name'];
var user_age = response['birthday'];
var user_picture = response['picture'];
}
},
function (error) {
console.log(error);
alert("Failed: " + JSON.stringify(error));
});
}
The Github page (https://github.com/Wizcorp/phonegap-facebook-plugin) says:
Getting a User's Birthday
Using the graph api this is a very simple task:
facebookConnectPlugin.api("<user-id>/?fields=id,email", ["user_birthday"],
function (result) {
alert("Result: " + JSON.stringify(result));
/* alerts:
{
"id": "000000123456789",
"email": "myemail#example.com"
}
*/
},
function (error) {
alert("Failed: " + error);
});
I might be losing my mind but the example on Github is saying how to get the birthday, and the scope is set up to get that, BUT then the parameters are set up to get the email address. Basically all I've done is changed "id,email" to "id,birthday"... What am I doing wrong?!
Apparently I was wrong to have "user_profile" in my initial login request... I guess it only accepts one parameter?
The bad version:
facebookConnectPlugin.login(["public_profile","user_birthday"],
fbLoginSuccess,
function (error) { alert("" + error) }
);
The good version:
facebookConnectPlugin.login(["user_birthday"],
fbLoginSuccess,
function (error) { alert("" + error) }
);
I'm using Azure Mobile Services(AzMS) in VisualStudio JS-Apache Cordova project where I call a AzMS's custom API to insert user data in storage. This very same code I have previously used in a VS web app javascript and there it is working fine.
However here in the cordova project, I get an "unexpected connection failure" error when calling invokeApi. When I try from VS web app, it works fine, which means the custom API service code is good.
Here is my js client code:
azmsClient.login(oAuthProvider).done(function (results) {
console.log("You are now logged in as: " + results.userId);
var theUserAuthId = results.userId;
azmsClient.invokeApi('Users/insert', {
method: 'POST',
body: { userAuthId: theUserAuthId }
}).done(function (response) {
//.... success code
},
function (error) {
console.log("Error: " + err.request.responseText);
//.... error handling
});
},
function (err) {
console.log("Error: " + err.request.responseText);
//.... error handling
});
In the console log, the first log ("You are now logged in as: "..) gets logged, after that the error - unexpected connection failure.
And my azure custom Api code -
var logger = require('../api/logUtils.js').logger;
exports.register = function(api){
api.post('insert', insertUser);
};
/******************************************************************
* #param request
* #param response
*******************************************************************/
function insertUser(request, response){
var user = request.user;
var iM = "api.User.insertUser-";
logger.info( iM + ' called: - ' , request, response, user);
// Data validation
if ( user.level === 'anonymous' ) {
logger.error( iM + 'Anonymous User' );
response.send(500, { error: "Anonymous user." });
}
user.getIdentities({
success: function (identities) {
var req = require('request');
var userId = user.userId.split(':')[1];
var theProvdr = user.userId.split(':')[0];
var reqParams;
logger.info(iM + ': calling getOAuthUserDetails for Identities: - ' , identities);
try {
reqParams = getOAuthUserDetails(userId, identities);
}
catch(err){
logger.error(iM + ': getOAuthUserDetails - ' , err);
response.send(500, { error: err.message });
return;
}
req.get(reqParams, function (err, resp, body) {
if (err) {
logger.error(iM + ': Error calling provider: ', err);
response.send(500, { error: 'Error calling Authentication provider' });
return;
}
if (resp.statusCode !== 200) {
logger.error(iM + ': Provider call did not return success: ', resp.statusCode);
response.send(500, { error: 'Provider call did not return success: ' + resp.statusCode });
return;
}
try {
logger.info(iM + ': success: got User Details body ', body);
var theAppUser = oAuthUser_To_appUser(theProvdr, JSON.parse(body));
addUser(theAppUser, user, {
success: function(userAlreadyExist, userEnt){
logger.info( iM + ': addUser: success', userEnt);
response.send(200, getAppUserEnt(userEnt));
},
error: function(err){
logger.error( iM + ': Error in addUser: ', err);
response.send(500, { error: err.message });
}
});
} catch (err) {
logger.info(iM + ': Error parsing response: ', err);
response.send(500, { error: err.message });
}
});
},
error: function(err){
logger.info(iM + ': error on calling getIdentities: - ' , err);
response.send(500, { error: err.message });
}
});
In the azure service logs, I see no entry logged from the custom api's user.insert function when running from the cordova project, which means the api is got getting called. Like said before, when calling from VS web project, the log records look all good.
(this is somewhat similar to the issue asked here, but not exactly the same.)
I am unable to figure out why its happening so; any idea?
Are you running on a device, emulator, or Ripple. If its Ripple, you have to change the Cross Domain Proxy to 'disabled'. I had similar issues and this seemed to help.
I'm trying to use Parse.com to sign users up to my application I'm developing. However I seem to get an error when firing my function.
Parse.initialize("APP ID", "JS KEY");
function signUp() {
var user = new Parse.User();
// Get user inputs from form.
var username = document.login.username.value;
var password = document.login.password.value;
user.set("username", username);
user.set("password", password);
user.signUp(null, {
success: function (user) {
// Hooray! Let them use the app now.
alert("Success");
},
error: function (user, error) {
// Show the error message somewhere and let the user try again.
alert("Error: " + error.code + " " + error.message);
}
});
};
The error:
Error: 100 XMLHttpRequest failed: {"statusText":"","status":0,"response":"","responseType":"","responseXML":null,"responseText":"","upload":{"ontimeout":null,"onprogress":null,"onloadstart":null,"onloadend":null,"onload":null,"onerror":null,"onabort":null},"withCredentials":false,"readyState":4,"timeout":0,"ontimeout":null,"onprogress":null,"onloadstart":null,"onloadend":null,"onload":null,"onerror":null,"onabort":null}
Any help here would be great, i'm unsure what's causing the error. Seems to work correctly when i'm not passing form data through it. Thanks.
I think you instead should use:
user.setUsername(username);
user.setPassword(password);
Also, these can be combined:
Parse.User.signUp(username, password, { ACL: new Parse.ACL() }, {
success: function (user) {
// Hooray! Let them use the app now.
alert("Success");
},
error: function (user, error) {
// Show the error message somewhere and let the user try again.
alert("Error: " + error.code + " " + error.message);
}
});