I have a simple Cloud Code command to create or update an object. If there is NO objectId passed in, the routine creates a new object and returns the objectId. If the objectId exists in the parameter list, it fetches the object and updates the parameters accordingly.
The routine works for new objects fine.
The object.save()
is failing when I try to update an object, despite the object.fetch()
sub-routine working.
error: code=101, message=Object not found.
Verbose server logs indicate a very strange PUT
command...
PUT /parse/classes/Receipt/[object%20Object]
what I would expect to see is
PUT /parse/classes/Receipt/GJaXcf7fLD
Object ACL is public r+w
Why is the object.save()
not working with a valid objectId?
_
Cloud Code
Parse.Cloud.define("uploadReceipt", function(request,response) {
var Receipt = Parse.Object.extend("Receipt");
var receipt = new Receipt();
// passed in parameters are ['property' : ['type' : t, 'value' : v]]
var dict = request.params;
var objectIdDict = dict["objectId"];
console.log("Object Dict: " + objectIdDict);
Parse.Promise.as().then(function() {
// if we already have an objectId we are UPDATING
// Need to FETCH first
if (objectIdDict != undefined) {
console.log("Searching for ID: " + objectIdDict["value"]);
receipt.set("objectId",objectIdDict["value"]);
return receipt.fetch();
}
else {
console.log("NEW RECEIPT");
return Parse.Promise.as(receipt);
}
}).then(function(receipt) {
console.log("Receipt: " + receipt.id);
// copy over the keys from our passed in parameters to the object
for (var key in dict) {
//console.log("Key: " + key + " Value: " + dict[key]["value"]);
if (dict[key]["type"] == "Raw") {
console.log("Key: " + key + " Value: " + dict[key]["value"]);
receipt.set(key,dict[key]["value"]);
}
else if (dict[key]["type"] == "Date" && key != "updatedAt") {
console.log("Key: " + key + " Value: " + dict[key]["value"]);
var time = dict[key]["value"] * 1000; // milliseconds
receipt.set(key,new Date(time));
}
else {
// object type
var Obj = Parse.Object.extend(dict[key]["type"]);
var newObj = new Obj();
newObj.id = dict[key]["value"];
receipt.set(key,newObj);
}
}
// make sure our user is set
receipt.set("user",request.user);
// adjust the status because it has now been uploaded
receipt.set("status",RECEIPT_SUBMITTED);
console.log("Prior to save");
return receipt.save();
}).then(function(receipt) {
console.log("Finished");
response.success({"status":receipt.get("status"),"objectId":receipt.id});
},function (error) {
console.log(error);
response.error(error);
});
});
Object should be updated accordingly
error: code=101, message=Object not found.
Server
Database
Storing NEW object returns
verbose: POST /parse/classes/Receipt { 'user-agent': 'node-XMLHttpRequest, Parse/js1.8.5 (NodeJS 5.10.1)',
accept: '*/*',
'content-type': 'text/plain',
host: 'localhost:1337',
'content-length': '471',
connection: 'close' } {
"date": {
"__type": "Date",
"iso": "2016-06-19T00:30:37.492Z"
},
"category": {
"__type": "Pointer",
"className": "Category",
"objectId": "XZ1bSHtZBY"
},
"status": 0,
"amount": 61.45,
"notes": "Hopefully this works well",
"gui_status": -1,
"currency": "USD",
"user": {
"__type": "Pointer",
"className": "_User",
"objectId": "vL4ih9BAX8"
}
}
verbose: {
"status": 201,
"response": {
"objectId": "GJaXcf7fLD",
"createdAt": "2016-06-19T00:30:57.092Z"
},
"location": "http://localhost:1337/parse/classes/Receipt/GJaXcf7fLD"
}
Finished
verbose: {
"response": {
"result": {
"status": 0,
"objectId": "GJaXcf7fLD"
}
}
}
Attempt to Update object returns
verbose: PUT /parse/classes/Receipt/[object%20Object] { 'user-agent': 'node-XMLHttpRequest, Parse/js1.8.5 (NodeJS 5.10.1)',
accept: '*/*',
'content-type': 'text/plain',
host: 'localhost:1337',
'content-length': '473',
connection: 'close' } {
"category": {
"__type": "Pointer",
"className": "Category",
"objectId": "XZ1bSHtZBY"
},
"status": 0,
"amount": 5.47,
"notes": "How about now",
"gui_status": 0,
"date": {
"__type": "Date",
"iso": "2016-06-19T00:12:25.788Z"
},
"currency": "USD",
"user": {
"__type": "Pointer",
"className": "_User",
"objectId": "vL4ih9BAX8"
}
}
verbose: error: code=101, message=Object not found.
ParseError { code: 101, message: 'Object not found.' }
verbose: error: code=141, code=101, message=Object not found.
Figured it out thanks to some help from the parse-server community and GitHub user flovilmart
In the case of 'updating' an object, I was including a dictionary entry for the Receipt. This was successfully retrieving the Receipt that I wanted to update.
However, the issue was that once I pulled in the receipt object and was iterating through my dictionary of properties to update... I ran into the Receipt object information again. Thus I was trying to add a property of Receipt pointer to my Receipt with the pointer being itself! Ugh.
The very last else clause needed a condition on it to NOT include the pointer to the Receipt (itself)
for (var key in dict) {
if
....
else if (dict[key]["type"] != "Receipt"){
// object type, but don't include ourself! (the Receipt)
var Obj = Parse.Object.extend(dict[key]["type"]);
var newObj = new Obj();
newObj.set("objectId",dict[key]["value"]);
receipt.set(key,newObj);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With