最终目标是使用Cloud Code中的beforeSave
函数检测现有Parse对象与传入更新之间的更改。
从parse.com上的Cloud Code日志中,可以看到beforeSave
的输入包含一个名为original
的字段,另一个包含了update
的字段。
云代码日志:
Input: {"original": { ... }, "update":{...}
我想知道是否以及如何访问原始字段,以便在保存之前检测到更改的字段。
请注意,我已经尝试了几种方法来解决此问题,但均未成功:
请注意
request.object.changedAttributes()
:在beforeSave和afterSave中使用时返回
false
-有关更多详细信息,请参见下文:记录
before_save
-出于可读性的考虑进行了总结:Input: { original: {units: '10'}, update: {units: '11'} }
Result: Update changed to { units: '11' }
[timestamp] false <--- console.log(request.object.changedAttributes())
记录相应的
after_save
:[timestamp] false <--- console.log(request.object.changedAttributes())
最佳答案
changedAttributes()
存在问题。它似乎一直在回答错误-或至少在合理需要的beforeSave
中回答。 (请参阅here以及其他类似文章)
这是一种通用的变通方法,用于执行changedAttributes应该执行的操作。
// use underscore for _.map() since its great to have underscore anyway
// or use JS map if you prefer...
var _ = require('underscore');
function changesOn(object, klass) {
var query = new Parse.Query(klass);
return query.get(object.id).then(function(savedObject) {
return _.map(object.dirtyKeys(), function(key) {
return { oldValue: savedObject.get(key), newValue: object.get(key) }
});
});
}
// my mre beforeSave looks like this
Parse.Cloud.beforeSave("Dummy", function(request, response) {
var object = request.object;
var changedAttributes = object.changedAttributes();
console.log("changed attributes = " + JSON.stringify(changedAttributes)); // null indeed!
changesOn(object, "Dummy").then(function(changes) {
console.log("DIY changed attributes = " + JSON.stringify(changes));
response.success();
}, function(error) {
response.error(error);
});
});
通过客户端代码或数据浏览器将
someAttribute
(Dummy
实例上的数字列)从32更改为1222时,日志显示如下: