解析服务器云代码:级联删除多个类中的对象

时间:2017-01-24 02:00:00

标签: heroku promise cloud-code parse-server

问题: 使用Parse Cloud Code的afterDelete触发器级联删除来自不同Parse类的多个对象。例如,在用户删除帖子后,我还想删除与该帖子相关的评论和喜欢。 让我们在Parse说我有一个帖子,评论和喜欢的课程。

我认为我的代码的问题与以下任何一个或两个有关: 1.在适当的位置使用{useMasterKey:true} 2.将关联的注释结果传递给关联的喜欢导致以下然后是promise块,以便通过destroyAll()将它们一起删除 我已经搜索了现有的Parse-server Github问题,并尝试了StackOverflow论坛,但还没有找到任何帮助解决这个问题。

重现的步骤:

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

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

});

预期结果 用户删除帖子后,还应删除与该帖子相关的评论和喜欢。

实际结果 没有与帖子相关的评论或喜欢被删除。

环境设置

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

关于这里可能存在什么问题的任何想法?谢谢!

1 个答案:

答案 0 :(得分: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), {