Как писать перед удалением с несколькими запросами в Parse Cloude Code
Мне нужно написать функцию beforeDelete в коде разбора облака с более чем одним запросом. Следующий код удалит все комментарии, но не изображения
примечание: объект Post имеет 2 столбца (Relation и Relation). Image и Comment являются пользовательскими классами.
например
Parse.Cloud.beforeDelete("Post", function(request, response) {
// delete all its comments
const commentsQuery = new Parse.Query("Comment");
commentsQuery.equalTo("postId", request.object.get("objectId"));
commentsQuery.find({ useMasterKey: true })
.then(function(comments) {
return Parse.Object.destroyAll(comments,{useMasterKey: true});
})
.catch(function(error) {
response.error("Error finding comments line 91 " + error.code + ": " + error.message);
});
// delete all its images
const postQuery = new Parse.Query("Post");
postQuery.equalTo("postId", request.object.get("objectId"));
// postQuery.include("images");
postQuery.first({useMasterKey: true})
.then(function(aPost){
var images = aPost.relation("images");
images.query().find({useMasterKey: true}).then(function(foundImages){
return Parse.Object.destroyAll(foundImages,{useMasterKey: true});
}).catch(function(error){
response.error("Error finding images line 107 " + error.code + ": " + error.message);
});
})
.catch(function(error) {
console.error("Error finding related comments " + error.code + ": " + error.message);
response.error("Error finding post line 113 " + error.code + ": " + error.message);
});
response.success();
});
редактировать
Parse Log
2018-03-19T00:33:50.491Z - beforeDelete failed for Post for user undefined:
Input: {"User":{"__type":"Pointer","className":"_User","objectId":"LZXSK7AwE7"},"Content":"","Title":"ios ui, coffee shop app","isPublic":true,"createdAt":"2017-11-23T06:37:55.564Z","updatedAt":"2018-03-19T00:32:30.180Z","views":2,"images":{"__type":"Relation","className":"Image"},"mainColors":{"__type":"Relation","className":"Color"},"Comments":{"__type":"Relation","className":"Comment"},"objectId":"3UDJCIXxGS"}
Error: {"code":141,"message":"Error finding images line 107 undefined: A promise was resolved even though it had already been resolved."}
Как это исправить, чтобы успешно уничтожить все свои изображения и комментарии
1 ответ
Я предлагаю реорганизовать код в меньшие тестируемые функции с обещанием возврата, что-то вроде этого...
function commentsForPost(postId) {
const commentsQuery = new Parse.Query("Comment");
commentsQuery.equalTo("postId", postId);
return commentsQuery.find({ useMasterKey: true })
}
function destroy(objects) {
return Parse.Object.destroyAll(objects,{useMasterKey: true});
}
function imagesForPost(post) {
let images = post.relation("images");
return images.query().find({useMasterKey: true});
}
Теперь функция beforeDelete понятна и проста...
Parse.Cloud.beforeDelete("Post", function(request, response) {
// get the post's comments
let post = request.object;
return commentsForPost(post.id)
.then(comments => destroy(comments))
.then(() => imagesFromPost(post))
.then(images => destroy(images))
.then(() => response.success());
});