Search code examples
javascriptbackbone.jsparse-platform

Destroying objects from Parse Cloud is unreliable


I'm trying to delete all objects in a class, but whenever I attempt to delete objects from a cloud function or job I get an inconsistent number of objects left over. The jobs always take under second, so I don't think that's the issue (working with under 100 objects anyway). I seem to always have a random number of objects left over and no errors. This is what I'm working with now.

Parse.Cloud.job("deletePosts", function(request, status) {

  Parse.Cloud.useMasterKey();
  var query = new Parse.Query("Posts");
  query.find({
      success: function(results) {
        Parse.Object.destroyAll(results).then(function() {
              console.log("Delete job completed.");
              status.success("Delete job completed.");
          });
      },
      error: function(error) {
          console.log("Error in delete query error: " + error);
          status.error("Error in delete query error: " + error);
      }
  });

});

Solution

  • When deleting objects in cloud code, use query.each instead of query.find to ensure that you delete all objects matching the query .

    find has the query limitation of 100 objects returned by default (or up to 1000 if limit is used). Source

    Below is an example of using a promise chain which calls destroy on each Post object. When all of the destroy promises have completed, the success status will be reached, and if any of the destroys fail then the error status will be reached.

    Parse.Cloud.job("deletePosts", function(request, status) {
    
      Parse.Cloud.useMasterKey();
      var query = new Parse.Query("Posts");
      query.each(function(post) {
          return post.destroy();
      }).then(function() {
          console.log("Delete job completed.");
          status.success("Delete job completed.");
      }, function(error) {
          alert("Error: " + error.code + " " + error.message);
          status.error("Error: " + error.code + " " + error.message);
      });
    
    });