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);
});
});