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])
但是,我假设 comments
和 likes
是对象数组,所以你在调用它
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中的函数