【发布时间】:2015-10-02 20:00:11
【问题描述】:
我正在尝试使用 CloudCode beforeSave 函数将 新对象 与 原始 进行比较。我需要将 update 中发送的字段与现有值进行比较。问题是我无法正确获取对象。当我运行查询时,我总是从发送的对象中获取值。
更新:我尝试了一种不同的方法,并且可以获得旧的寄存器(已经保存在解析中的那个)。 但是在请求中发送的新请求被旧请求覆盖。什么?!另一个问题是,即使代码发送了response.success(),更新也没有保存。
我认为我在这里遗漏了一些非常明显的东西。或者我正面临一个错误或什么...
新方法
Parse.Cloud.beforeSave('Tasks', function(request, response) {
if ( !request.object.isNew() )
{
var Task = Parse.Object.extend("Tasks");
var newTask = request.object;
var oldTask = new Task();
oldTask.set("objectId", request.object.id);
oldTask.fetch()
.then( function( oldTask )
{
console.log(">>>>>> Old Task: " + oldTask.get("name") + " version: " + oldTask.get("version"));
console.log("<<<<<< New Task: " + newTask.get("name") + " version: " + newTask.get("version"));
response.success();
}, function( error ) {
response.error( error.message );
}
);
}
});
OBJ 发送 {"name":"LLL", "version":333}
日志
I2015-10-02T22:04:07.778Z]v175 before_save triggered for Tasks for user tAQf1nCWuz:
Input: {"original":{"createdAt":"2015-10-02T17:47:34.143Z","name":"GGG","objectId":"VlJdk34b2A","updatedAt":"2015-10-02T21:57:37.765Z","version":111},"update":{"name":"LLL","version":333}}
Result: Update changed to {}
I2015-10-02T22:04:07.969Z]>>>>>> Old Task: GGG version: 111
I2015-10-02T22:04:07.970Z]<<<<<< New Task: GGG version: 111
注意:我正在通过 cURL 和解析控制台测试登录。
CloudCode beforeSave
Parse.Cloud.beforeSave("Tasks", function( request, response) {
var query = new Parse.Query("Tasks");
query.get(request.object.id)
.then(function (oldObj) {
console.log("-------- OLD Task: " + oldObj.get("name") + " v: " + oldObj.get("version"));
console.log("-------- NEW Task: " + request.object.get("name") + " v: " + request.object.get("version"));
}).then(function () {
response.success();
}, function ( error) {
response.error(error.message);
}
);
});
cURL 请求
curl -X PUT \
-H "Content-Type: application/json" \
-H "X-Parse-Application-Id: xxxxx" \
-H "X-Parse-REST-API-Key: xxxxx" \
-H "X-Parse-Session-Token: xxxx" \
-d "{\"name\":\"NEW_VALUE\", \"version\":9999}" \
https://api.parse.com/1/classes/Tasks/VlJdk34b2A
JSON 响应
"updatedAt": "2015-10-02T19:45:47.104Z"
记录 日志打印 original 和 new 值,但我也不知道如何访问它。
I2015-10-02T19:57:08.603Z]v160 before_save triggered for Tasks for user tAQf1nCWuz:
Input: {"original":{"createdAt":"2015-10-02T17:47:34.143Z","name":"OLD_VALUE","objectId":"VlJdk34b2A","updatedAt":"2015-10-02T19:45:47.104Z","version":0},"update":{"name":"NEW_VALUE","version":9999}}
Result: Update changed to {"name":"NEW_VALUE","version":9999}
I2015-10-02T19:57:08.901Z]-------- OLD Task: NEW_VALUE v: 9999
I2015-10-02T19:57:08.902Z]-------- NEW Task: NEW_VALUE v: 9999
【问题讨论】:
-
我不确定你能做到这一点。你这样做的目的是什么?也许我们可以找到不同的解决方案。
-
我需要检查寄存器的版本,并与请求中发送的版本进行比较。
-
这很奇怪,我真的不明白为什么你的标有“新方法”的版本不起作用......它应该。我看到您关于 Parse.Object.disableSingeInstance 的注释,但这是我第一次听说。似乎这非常低效,因为您必须两次获取对象。我会通过 Twitter 或 FB 联系 Hector 并询问此事。
-
@MobileVet 我完全同意你的看法。在生产场景中,我的解决方案是不可取的。事实上,这个问题太疯狂了,我正在考虑完全放弃 Parse。如果这个 Hector 是 Parse.com 的人,你能给我他的联系方式吗?也许他能把我从这个地狱里救出来。
-
@MobileVet 我已经有了他的联系方式。 Tks 给小费。现在会尝试联系他
标签: javascript parse-platform parse-cloud-code before-save