Доступ к исходному полю в Parse.com облачный код перед сохранением функции


Конечной целью является обнаружение изменений между существующим объектом синтаксического анализа и входящим обновлением с помощью функции beforeSave в облачном коде.

Из журнала облачного кода, доступного через parse.com, можно увидеть, что вход в beforeSave содержит поле под названием original и другое поле под названием update.

Журнал облачного кода:

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

Интересно, можем ли мы получить доступ к исходному полю, чтобы обнаружить изменяющиеся поля перед сохранением.

Обратите внимание, что я уже пытался несколько подходов для решения этой проблемы без успеха:

  • using (object).changedAttributes ()
  • using (object).previousAttributes ()
  • выборка существующего объекта, перед обновлением его новыми данными

Примечание о request.object.changedAttributes(): возвращает false при использовании в beforeSave и afterSave -- Подробнее см. ниже:

Журнал для 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())
1   3  

1 ответ:

Там есть проблема с changedAttributes(). Кажется, что он отвечает ложно все время - или, по крайней мере, в beforeSave, где это было бы разумно необходимо. (Смотрите здесь, а также другие подобные сообщения)

Вот общая цель обхода, чтобы сделать то, что 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 через клиентский код или браузер данных, журнал показывает следующее:

I2015-06-30T20: 22: 39.886 Z] изменено атрибуты = false

I2015-06-30T20: 22: 39.988 Z] DIY изменил атрибуты = [{"oldValue": 32, "newValue": 1222}]