我正在尝试在我的Parse.com后端使用beforeSave触发器,但看起来使用该触发器会导致从我的应用程序发送的数据被忽略,而只保存我在beforeSave触发器中所做的更改本身。
(注意:对于下面的示例,我使用的是Xamarin TodoParseAuth示例应用的稍微调整版本。)
使用以下代码时:
Parse.Cloud.beforeSave("TodoItem", function(request, response) {
request.object.set("Description", "Where have all my changes gone?");
response.success();
});
保存新对象,导致仅保存“描述”值,实际从iOS示例应用程序发送到Parse的值将被忽略,保存新行但将NULL保存到所有其他字段中。
日志文件显示:
I2015-10-05T01:30:12.365Z]v17 before_save triggered for TodoItem for user KiKpmdbErc:
Input: {"original":null,"update":{"ACL":{"KiKpmdbErc":{"read":true,"write":true}},"Description":"fifth notes","IsDone":true,"Title":"Fifth task"}}
Result: Update changed to {"Description":"Where have all my changes gone?"}
尝试更新现有行会忽略其他更新值,并且仅更新“描述”字段(使用来自beforeSave触发器的值)。记录更新显示:
I2015-10-05T01:52:14.267Z]v17 before_save triggered for TodoItem for user KiKpmdbErc:
Input: {"original":{"ACL":{"KiKpmdbErc":{"read":true,"write":true}},"Description":"This is my first task. Yay.","IsDone":true,"IsNewest":false,"Title":"First Task","createdAt":"2015-09-18T23:08:16.159Z","objectId":"w0MLHAwgij","updatedAt":"2015-10-04T21:46:28.833Z"},"update":{"ACL":{"KiKpmdbErc":{"read":true,"write":true}},"Description":"This is my first task.","IsDone":false,"Title":"Still First Task"}}
Result: Update changed to {"Description":"Where have all my changes gone?"}
两个日志都显示正确的original:
和update:
值(显示我尝试对Title
,IsDone
和Description
进行的更改),但实际写入后端的唯一更改是我在beforeSave触发器中设置的更新值。 (日志文件似乎通过“结果:更新更改为...”部分告诉我这个,但为什么?)
所有示例,其他Stackoverflow问题,Google网上论坛帖子等等。我可以发现这应该正常工作,所以我只是遗漏了其他内容或者在代码或我的Parse应用程序的其他地方需要更改其他内容?
2015年10月9日更新:
如下所示注释request.object.set("Description"...
行会导致更新看似完全被忽略,并且所有“user”字段写入的新行都设置为“(undefined)”,日志或错误日志中没有任何内容。
触发:
Parse.Cloud.beforeSave("TodoItem", function(request, response) {
//request.object.set("Description", "Where have all my changes gone?");
response.success();
});
记录(这是日志中的最后一个条目;没有保存的迹象):
I2015-10-09T17:49:15.350Z]Deployed v18 with triggers:
TodoItem:
before_save
删除beforeSave触发器会完全恢复“正确”行为:更新和插入将正确完成。
删除触发器:
//Parse.Cloud.beforeSave("TodoItem", function(request, response) {
// request.object.set("Description", "Where have all my changes gone?");
// response.success();
//});
日志在更新或插入后没有显示任何内容(正如预期的那样,因为现在没有触发器);日志中的最后一行是要更新的云代码:
I2015-10-09T18:00:46.686Z]Deployed v19 with triggers:
放回beforeSave触发器(使用不同的描述)会再次阻止更新:
Parse.Cloud.beforeSave("TodoItem", function(request, response) {
request.object.set("Description", "Breaking me again are you?");
response.success();
});
仅更新了描述字段,但下面的日志显示我尝试更新Description,Title和IsDone值:
I2015-10-09T18:13:15.559Z]v20 before_save triggered for TodoItem for user KiKpmdbErc:
Input: {"original":{"ACL":{"KiKpmdbErc":{"read":true,"write":true}},"Description":"Breaking me again are you?","IsDone":false,"Title":"Fifth Task","createdAt":"2015-10-09T18:07:10.012Z","objectId":"yZmkTXZxte","updatedAt":"2015-10-09T18:09:01.602Z"},"update":{"ACL":{"KiKpmdbErc":{"read":true,"write":true}},"Description":"Breaking me again are you? NOOOO","IsDone":true,"Title":"Fifth Task?"}}
Result: Update changed to {"Description":"Breaking me again are you?"}
据我所知,问题肯定在于beforeSave触发器:添加一个会破坏正确保存新数据或更改数据的能力,但删除它会恢复正确的保存。
答案 0 :(得分:0)
您使用的是什么版本的Parse SDK?我有一个类似的问题,我的所有字段突然消失,并通过回到使用JavaScript SDK版本1.4.2解决它。
Here是一个答案,我在其中描述了如何将其更改回1.4.2。