最终目标是使用Cloud Code中的beforeSave函数检测现有Parse对象与传入更新之间的更改。

从parse.com上的Cloud Code日志中,可以看到beforeSave的输入包含一个名为original的字段,另一个包含了update的字段。

云代码日志:

Input: {"original": { ... }, "update":{...}

我想知道是否以及如何访问原始字段,以便在保存之前检测到更改的字段。

请注意,我已经尝试了几种方法来解决此问题,但均未成功:
  • 使用(object).changedAttributes()
  • 使用(object).previousAttributes()
  • 提取现有对象,然后用新数据
  • 更新它

    请注意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时,日志显示如下:

    09-25 17:13