beforeSave中的Parse.com更新会导致忽略所有其他更改

时间:2015-10-05 02:07:56

标签: parse-platform cloud-code

我正在尝试在我的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:值(显示我尝试对TitleIsDoneDescription进行的更改),但实际写入后端的唯一更改是我在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触发器:添加一个会破坏正确保存新数据或更改数据的能力,但删除它会恢复正确的保存。

1 个答案:

答案 0 :(得分:0)

您使用的是什么版本的Parse SDK?我有一个类似的问题,我的所有字段突然消失,并通过回到使用JavaScript SDK版本1.4.2解决它。

Here是一个答案,我在其中描述了如何将其更改回1.4.2。