Fix for beforeSave with increment causing key to be Dropped (#4259)
* Fixes an issue where a beforeSave hook could cause a numeric val to be dropped in response. * Use hasOwnProperty to check instead * Remove redundant set
This commit is contained in:
committed by
GitHub
parent
557a2b2827
commit
315d30b426
@@ -1037,6 +1037,45 @@ describe('Cloud Code', () => {
|
||||
})
|
||||
});
|
||||
|
||||
/**
|
||||
* Checks that incrementing a value to a zero in a beforeSave hook
|
||||
* does not result in that key being omitted from the response.
|
||||
*/
|
||||
it('before save increment does not return undefined', (done) => {
|
||||
Parse.Cloud.define("cloudIncrementClassFunction", function (req, res) {
|
||||
const CloudIncrementClass = Parse.Object.extend("CloudIncrementClass");
|
||||
const obj = new CloudIncrementClass();
|
||||
obj.id = req.params.objectId;
|
||||
obj.save().then(
|
||||
function (savedObj) {
|
||||
res.success(savedObj);
|
||||
});
|
||||
});
|
||||
|
||||
Parse.Cloud.beforeSave("CloudIncrementClass", function (req, res) {
|
||||
const obj = req.object;
|
||||
if(!req.master) {
|
||||
obj.increment('points', -10);
|
||||
obj.increment('num', -9);
|
||||
}
|
||||
res.success();
|
||||
});
|
||||
|
||||
const CloudIncrementClass = Parse.Object.extend('CloudIncrementClass');
|
||||
const obj = new CloudIncrementClass();
|
||||
obj.set('points', 10);
|
||||
obj.set('num', 10);
|
||||
obj.save(null, {useMasterKey: true})
|
||||
.then(function() {
|
||||
Parse.Cloud.run('cloudIncrementClassFunction', { objectId: obj.id })
|
||||
.then(function(savedObj) {
|
||||
expect(savedObj.get('num')).toEqual(1);
|
||||
expect(savedObj.get('points')).toEqual(0);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('cloud jobs', () => {
|
||||
it('should define a job', (done) => {
|
||||
expect(() => {
|
||||
|
||||
@@ -1195,9 +1195,10 @@ RestWrite.prototype._updateResponseWithData = function(response, data) {
|
||||
const clientSupportsDelete = ClientSDK.supportsForwardDelete(this.clientSDK);
|
||||
this.storage.fieldsChangedByTrigger.forEach(fieldName => {
|
||||
const dataValue = data[fieldName];
|
||||
const responseValue = response[fieldName];
|
||||
|
||||
response[fieldName] = responseValue || dataValue;
|
||||
if(!response.hasOwnProperty(fieldName)) {
|
||||
response[fieldName] = dataValue;
|
||||
}
|
||||
|
||||
// Strips operations from responses
|
||||
if (response[fieldName] && response[fieldName].__op) {
|
||||
|
||||
Reference in New Issue
Block a user