PARSE 检查 BeforeSave 上的原始对象

rob*_*180 2 parse-platform parse-cloud-code parse-javascript-sdk

我需要在保存之前检查原始对象以查看更改的值。目前我有这个:

Parse.Cloud.beforeSave("Stats", function(request, response) {
if (!request.object.isNew()){
        var query = new Parse.Query("Stats");
        query.get(request.object.id, { 
            success: function(oldObject) {
            alert('OLD:' + oldObject.get("Score") + "new:" + request.object.get("Score"));
                /*Do My Stuff Here*/
                response.success(); 
            },
            error: function(oldObject, error) {
                response.error(error.message);
            }
        });
    }else{
        response.success();
    }

});
Run Code Online (Sandbox Code Playgroud)

问题是它oldObject等于request.object

警报结果也是:OLD:10 new:10,但真正的旧分数是5。另外根据之前的保存输入日志,原来是真的5

知道我做错了什么吗?

编辑:这是之前的保存日志。

before_save triggered for Stats as master:
Input: {"original":{"achievements":[],"Score":"100"updatedAt":"2015-11-02T10:09:24.170Z"},"update":{"Score":"110"}}
Result: Update changed to {"Score":"110"}
Run Code Online (Sandbox Code Playgroud)

Edit2:有没有办法获得脏值?

console.log("dirty: "+ request.object.dirty("score"));
I2015-11-03T14:23:12.198Z]dirty: true
Run Code Online (Sandbox Code Playgroud)

nat*_*rio 5

了解字段是否被修改的官方方法是调用dirty().

我的猜测是查询该特定对象以某种方式更新当前范围内该对象的所有“实例”,dirty()只有在查询之前调用这种方式才有效。

获取旧值和新值的一个选项是将其保留在单独的字段中。例如,您可以从您的客户端调用(伪编码,但您明白了):

// OldScore here is 0
statObject.put("Score") = 100;
statObject.saveInBackground();
Run Code Online (Sandbox Code Playgroud)

然后在云代码中:

Parse.Cloud.beforeSave("Stats", function(request, response) {

    var stat = request.object;
    if (!stat.isNew()){
        if (stat.dirty("Score")) {
            var newValue = stat.get("Score") // 100
            var oldValue = stat.get("OldScore") // 0

            // Do other stuff here

            stat.put("OldScore", newValue);
            response.success();

        } else {
            response.success();
        }
    } else {
        response.success();
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,您所描述的问题有些奇怪。也许您可以尝试使用fetch()命令;它应该返回旧值。但是,它会使所有其他脏字段无效。