Parse Server Cloud Code:级联删除多个类中的对象

Posted

技术标签:

【中文标题】Parse Server Cloud Code:级联删除多个类中的对象【英文标题】:Parse Server Cloud Code: Cascade delete objects from multiple classes 【发布时间】:2017-01-24 01:59:59 【问题描述】:

问题: 使用 Parse Cloud Code 的 afterDelete 触发器级联删除来自不同 Parse 类的多个对象。例如,在用户删除帖子后,我还想删除与该帖子关联的 cmets 和 likes。 假设在 Parse 中我有一个 Post、Comment 和 Like 类。

我认为我的代码的问题与以下一项或两项有关: 1. 在适当的地方使用 useMasterKey: true 2. 将关联的 cmets 结果传递给关联的喜欢结果在以下 then 承诺块中,以便通过 destroyAll() 一起删除它们 我搜索了现有的 Parse-server Github 问题并尝试了 ***、论坛,但没有找到任何可以帮助解决此问题的方法。

重现步骤:

这是我写的代码(不工作):

Parse.Cloud.afterDelete("Post", function(request) 
  var objectsToDelete = [];
  var commentQuery = new Parse.Query("Comment");
  commentQuery.equalTo("post", request.object);

  commentQuery.find(useMasterKey: true).then(function(comments) 
    var likeQuery = new Parse.Query("Like");
    likeQuery.equalTo("post", request.object);
    objectsToDelete.push(comments);
    return likeQuery.find(useMasterKey: true);
  ).then(function(likes) 
    objectsToDelete.push(likes);
    return Parse.Object.destroyAll(objectsToDelete, useMasterKey: true);
  ).then(function(success) 
    console.log("successfully deleted all associated comments AND likes.");
  , function(error) 
    console.error("Error deleting associated comments and likes " + error.code + ": " + error.message);
  );

);

预期结果 用户删除帖子后,还应删除与该帖子关联的 cmets 和 likes。

实际结果 与该帖子相关的 cmets 或点赞均未删除。

环境设置

解析服务器版本:2.3.2(最新) 操作系统:ios(客户端)使用 Swift 托管在 Heroku 上的服务器

对这里可能出现的问题有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

根据文档,Parse.Object.destroyAll 接受一个对象数组,例如

Parse.Object.destroyAll([object1, object2, object3])

但是,我假设 commentslikes 是对象数组,所以你在调用它

Parse.Object.destroyAll([[comment1, comment2, ...], [like1, like2, ...]])

所以,快速修复,像这样使用[].push.apply(objectsToDelete, array of objects)

).then(function(comments) 
    var likeQuery = new Parse.Query("Like");
    likeQuery.equalTo("post", request.object);
    [].push.apply(objectsToDelete, comments); // ***
    return likeQuery.find(
        useMasterKey: true
    );
).then(function(likes) 
    [].push.apply(objectsToDelete, likes); // ***
    return Parse.Object.destroyAll(objectsToDelete, 
        useMasterKey: true
    );
).then(function(success) 

或者,只需进行一次更改,在 destroyAll 调用中使用 [].concat.apply([], objectsToDelete) - 即

    return Parse.Object.destroyAll([].concat.apply([], objectsToDelete), 

【讨论】:

以上是关于Parse Server Cloud Code:级联删除多个类中的对象的主要内容,如果未能解决你的问题,请参考以下文章

Parse Image + Parse httpRequest 替换——从 Parse Cloud Code 迁移到 Parse Server on Node (Heroku / AWS / DO)

response.error不是Parse Cloud Code中的函数

parse.com Cloud Code 防止重复错误

使用 Parse Code Cloud Javascript 函数更改 Parse 列的值

使用 Parse Cloud Code 从数组中删除对象

Parse Cloud Code 中的调用函数