Доступ к исходному полю в 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 ответ:
Там есть проблема с
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}]