Javascript 访问Parse.com云代码beforeSave函数中的原始字段

Javascript 访问Parse.com云代码beforeSave函数中的原始字段,javascript,parse-platform,parse-cloud-code,Javascript,Parse Platform,Parse Cloud Code,最终目标是使用云代码中的beforeSave函数检测现有解析对象和传入更新之间的更改 从parse.com提供的云代码日志中,可以看到beforeSave的输入包含一个名为original的字段和另一个名为update的字段 云代码日志: Input: {"original": { ... }, "update":{...} 我想知道我们是否可以访问原始字段,以及如何在保存前检测更改的字段 请注意,我已经尝试了几种方法来解决这个问题,但没有成功: 使用(object.changedAttri

最终目标是使用云代码中的
beforeSave
函数检测现有解析对象和传入更新之间的更改

从parse.com提供的云代码日志中,可以看到beforeSave的输入包含一个名为original的字段和另一个名为update的字段

云代码日志:

Input: {"original": { ... }, "update":{...}
我想知道我们是否可以访问原始字段,以及如何在保存前检测更改的字段

请注意,我已经尝试了几种方法来解决这个问题,但没有成功:

  • 使用(object.changedAttributes())
  • 使用(object.previousAttributes())
  • 在使用新数据更新现有对象之前获取该对象

关于
request.object.changedAttributes()的注释
在beforeSave和afterSave中使用时返回
false
——有关更多详细信息,请参阅以下内容:

保存前的
日志--

Input: { original: {units: '10'}, update: {units: '11'} }
Result: Update changed to { units: '11' }
[timestamp] false <--- console.log(request.object.changedAttributes())
changedAttributes()
有问题。它似乎总是回答false——或者至少在save
之前的
中,这是合理需要的。(见,以及其他类似职位)

这里有一个通用的工作来做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
(虚拟
实例上的数字列)从32更改为1222时,日志显示:

I2015-06-30T20:22:39.886Z]更改的属性=错误

I2015-06-30T20:22:39.988Z]DIY改变属性= [{“旧值”:32,“新值”:1222}]


object.changedAttributes()
是正确的方法。请发布与此相关的尝试,我们会让它正常工作。
request.object.changedAttributes()
返回
false
如果您能对此进行演示(更改对象,然后查找
changedAttributes()===false
),那么您将发现parse.com错误。不过,我怀疑你错了。请通过发布一个别人可以复制的失败来证明我错了。添加了关于我正在谈论的案例的详细信息。请注意,我说的是云代码,而不是在客户端使用JSSDK。我很抱歉。我以为你有一个bug,只是责怪parse。我傲慢地决定,如果你懒得构建一个MRE,我会这样做,并以你的方式向你展示错误。想象一下,我发现同样的问题时会有多么惊讶!再次抱歉。作为忏悔,我在周围做了一个工作,并把它贴在下面。
// 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);
    });
});