So I have some cloud code I am trying to write to like a post.
My database is setup that users have a likedPosts array, which has object id's of all the posts that the user liked. Users also have a column coins, that should get incremented when users like their posts.
The post object has a likes column which is an integer that gets incremented with each like, and the post object also has a posterId column, which is the object id of the user that posted it.
Here is my function right now (I am not very good at javascript and cloud code, so if there is something horribly wrong, I'm sorry)
Parse.Cloud.define("likePost", function(request, response) {
Parse.Cloud.useMasterKey();
var senderId = request.params.senderId;
var postId = request.params.postId;
var post = new Parse.Object ({objectId: postId});
var posterId = post.posterId
var poster = new Parse.User ({objectId: posterId});
var sender = new Parse.User ({objectId: senderId});
sender.add("likedPosts", postId);
poster.increment("coins");
post.increment("likes");
poster.save(null, {useMasterKey:true, success:
function(poster) {
console.log("Successfully saved poster");
}, error: function(poster, error) {
console.error("Error saving poster: " + error.message);
response.error(error);
}
});
post.save(null,{useMasterKey:true, success:
function(post) {
console.log("Successfully saved post");
}, error: function(post, error) {
console.error("Error saving post: " + error.message);
response.error(error);
}
});
sender.save(null, {useMasterKey:true, success:
function(sender) {
console.log("Successfully saved sender");
}, error: function(sender, error) {
console.error("Error saving sender: " + error.message);
response.error(error);
}
});
response.success();
});
I call the function from swift like so:
PFCloud.callFunction(inBackground: "likePost", withParameters: ["senderId" : PFUser.current()!.objectId!, " postId": postObject!.objectId!], block: { (result, error) in
if (error != nil) {
print(error!)
} else {
print("success liking")
}
})
In my logs, however, I get the following error:
2017-06-21T21:47:59.499Z - Failed running cloud function likePost for user R4d8Zrcdhw with:
Input: {"senderId":"R4d8Zrcdhw"," postId":"XXbu55PdpR"}
Error: {"code":141,"message":{"code":200,"message":"bad or missing username"}}
2017-06-21T21:47:59.492Z - bad or missing username
My guess is that the request is missing a header to define the content-type. I've seen Parse return the "bad or missing username" error via the Parse REST API if the Swift URLSession was using an incorrect content-type header.
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
or
Parse.Cloud.httpRequest({
url: 'http://www.example.com/',
headers: {
'Content-Type': 'application/json;charset=utf-8'
}
})
Related
when i try and do the post, the data is send and the server receives it but the success function is never called. The connection appears in the network inspector tab of chrome as stalled and, a warning: connection is not finished yet.
script:
var modif = {
CRN: $("#DIAS").parent().parent().parent().children()[0].children[0].innerText,
DIAS: $("#DIAS").val(),
start_hr: $("#STRHR").val(),
end_hr: $("#ENDHR").val(),
title: $("#TITLE").val()
}
$.ajax({
url: '/cmanager/edit',
dataType: 'text',
type: 'POST',
data: modif,
success: function (order) {
alert("functiono!");
},
error: function(jqXHR, textStatus, errorThrown) {
alert("Error, status = " + textStatus + ", " +
"error thrown: " + errorThrown
);
server:
app.post("/cmanager/edit",function (req, res) {
var CRN = req.body.CRN;
var DIAS = req.body.DIAS;
var start_hr = req.body.start_hr;
var end_hr = req.body.end_hr;
var title = req.body.title;
console.log(CRN);
console.log(DIAS);
console.log(start_hr);
console.log(end_hr);
console.log(title);
var usrq = "update section natural join class set DIAS = '"+DIAS+"', start_hr = '"+start_hr+"', end_hr = '"+end_hr+"', title = '"+title+"' where CRN = '"+CRN+"';";
connection.query(usrq, function (error, results, fields) {
if (error)
console.log(error.code);
else
try {
console.log("hello");
} catch (error) {
console.log("bad ifo by client");
}
});
})
Nowhere in your server are you actually sending any data back to the client.
In your server, you need to call res.end() at a minimum. It looks to me what you actually want is res.sendStatus(204);.
Also note that you are wide open to SQL injection attacks, and you will be hacked if you haven't been already. Always use parameterized queries to avoid this problem entirely.
Whenever I try to run this snippet of cloud code, I receive an error stating that:
Error generating response. ParseError {
code: 141, message: 'Push failed to send with error: master key is required'}
I've tried to follow some of the other solutions on the site such as using Parse.Cloud.useMasterKey() & useMasterKey: true but I haven't found success with any of these commands (possibly due to me using them incorrectly?).
Parse.Cloud.define("sendPushToUser", function(request, response) {
var senderUser = request.user;
var recipientUserId = request.params.recipientId;
var message = request.params.message;
var recipientUser = new Parse.User();
recipientUser.id = recipientUserId;
var pushQuery = new Parse.Query(Parse.Installation);
pushQuery.equalTo("user", recipientUser);
Parse.Push.send({
where: pushQuery,
data: {
alert: message
}
}).then(function() {
response.success("Push was sent successfully.")
}, function(error) {
response.error("Push failed to send with error: " + error.message);
});
});
Swift function:
func testPush() {
PFCloud.callFunction(inBackground: "sendPushToUser", withParameters: ["recipientId": PFUser.current()?.objectId!, "message" : "Test notification"]) { (success, error) in
if error != nil {
print("error occurred")
}else {
print("Sent successfully")
}
}
}
As Gellert Lee suggested
Did you configure your masterKey in your index.js? masterKey : process.env.MASTER_KEY ||'your masterkey'
I am trying to signup the user on parse server.I have initialize the parse object to applicationid and key, but I am not able to signup.I am getting unauthorize error.I am working on chrome app. i also allow the permission in mainifest file.
Parse.initialize("app_id", "key");
var username= "jitendra.singh#gmail.com";
var password = "singh";
Parse.User.signUp(username, password, {}, {
success: function (user) {
console.log("Yay!");
},
error: function (user, error) {
console.log("Error: " + error.code + " " + error.message);
}
});
Error:
POST https://api.parse.com/1/users 401 (Unauthorized)
init your parse
Parse.initialize("app_id", "key");
call this function
function Signup(userInfo){
var user = new Parse.User();
// set the properties of the user
user.set("username", "username");
user.set("password", "password");
user.set("email", "emailid");
// Create a custom field for the user (there is no limit to the number of custom records)
user.set("score", 0);
user.signUp(null, {
success: function(user) {
// return the success response
console.log("Success!");
},
error: function(user, error) {
// return the error response
console.log("Error: " + error.code + " " + error.message);
}
});
}
If you are using the parse-server then you need to change the initialize
JavaScript
Parse.initialize("YOUR_APP_ID");
Parse.serverURL = 'http://localhost:1337/parse'
See https://github.com/ParsePlatform/parse-server/wiki/Parse-Server-Guide#migrating
I use Parse.com cloud to manage my database for mobile application. When I save in table user some user with the same username or email it gives me the error:
POST https://api.parse.com/1/users 400 (Bad Request)
I understood by myself that error appears when the username or email are the same in different users. Is there a method to return the reason of the error like "this mail is already chosen"? Below my code:
saveUser: function() {
this.utente.save(null, {
success: function(persona) {
//console.log("modello salvato nel db");
var id = persona.get("objectId");
window.localStorage.setItem('parseId', id);
},
error: function(error) {
alert("Save error");
console.log(error);
}
});
},
Looks like you aren't using response.error(error) anywhere...
Try
saveUser: function() {
this.utente.save(null, {
success: function(persona) {
//console.log("modello salvato nel db");
var id = persona.get("objectId");
window.localStorage.setItem('parseId', id);
},
error: function(error) {
response.error(error);
}
});
}
And then in your native script console.log the error.code and error.message.
I am facing 2 issues with writing a background job in parse
Here is my code
Parse.Cloud.job("createSilentUsers",function(request,response){
// Set up to modify user data
Parse.Cloud.useMasterKey();
//get all the users from backupusers table where isbiscootactivated = 0 and issnsactivated=0
// Query for all users
var query = new Parse.Query("biscootusers");
query.equalTo("isbiscootactivated",0);
query.equalTo("issnsactivated",0);
query.first({
success: function(result) {
// Successfully retrieved the object.
var objUser = result;
console.log(result.attributes.deviceid);
console.log(result.attributes.imei);
console.log(result.attributes.appname);
console.log(result.attributes.appid);
console.log(result.attributes.appversion);
//check if the deviceid and imei set is already a biscoot activated user
var promise = Parse.Promise.as();
promise = promise.then(function() {
console.log("we are inside the prmise");
return Parse.Cloud.httpRequest({
method: 'POST',
url: 'http://<our server name>/1.0/PartnerActivation/isDeviceExists',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'},
body: {
imei: result.attributes.imei,
deviceid: result.attributes.deviceid,
appname: result.attributes.appname,
appid: result.attributes.appid,
appversion: result.attributes.appversion}
}).then(function(httpResponse)
{
console.log("Response of isdeviceactivated is " + httpResponse.text);
if(httpResponse.text == 'true' || httpResponse.text="True")
{
console.log("The user is already activated");
objUser.set("isbiscootactivated",1);
objUser.save();
}
else
{
//do the biscoot activation here
console.log("its not activated, lets do the biscootusers activation");
}
},
function(error) {
console.log("error occurred during isDeviceExists api as " + error);
});
});
console.log("nothing seems to have happened");
},
error: function(error) {
console.log("Error: " + error.code + " " + error.message);
}
}).then(function() {
// Set the job's success status
status.success("All the users been set to the db successfully");
}, function(error) {
// Set the job's error status
status.error("Uh oh, something went wrong.");
});
});
The Issues I have are
In the logs I frequently see this error
Ran job createSilentUsers with:
Input: {}
Failed with: ReferenceError: status is not defined
at main.js:74:9
at r (Parse.js:2:4981)
at Parse.js:2:4531
at Array.forEach (native)
at Object.E.each.E.forEach [as _arrayEach] (Parse.js:1:666)
at n.extend.resolve (Parse.js:2:4482)
at null. (Parse.js:2:5061)
at r (Parse.js:2:4981)
at n.extend.then (Parse.js:2:5327)
at r (Parse.js:2:5035)
The http request just doesn't seem to work, while it always does if I test it from some http REST client.
Just change the "response" to "status" on the funcion header.
Parse.Cloud.job("createSilentUsers",function(request,response){
to this
Parse.Cloud.job("createSilentUsers",function(request,status){