Search code examples
javascriptparse-platformdestroy

Calling user.destroy() doesn't actually delete database record


We started the app with Parse and have been hitting problems since it shut down.

Destroying a user is not working in this deleteUser function

Parse.Cloud.define('deleteUser', function(request, response) {
var objectId = request.params.objectId;

if(!objectId || objectId.length === 0 || !objectId.trim()) {
    response.error("The user object id is needed to perform this action.");
}

Parse.Cloud.useMasterKey();
var query = new Parse.Query(Parse.User);
query.get(objectId, {
  success: function(user) {
    user.destroy(null, {
      success: response.success(user),
      error: function(user, error) {
        response.error(error);
      }
    });
  },
  error: function(error) {
    response.error("Could not find the user.");
  }
});
});

deleteEvent works just fine and I've also tried copying this exact syntax for deleteUser with no luck.

Parse.Cloud.define('deleteEvent', function(request, response) {

var objectId = request.params.objectId;

if(!objectId || objectId.length === 0 || !objectId.trim()) {
    response.error('The event object id is needed to perform this action.');
    return;
}

Parse.Cloud.useMasterKey();
var query = new Parse.Query(Parse.Object.extend('Events'));
query.get(objectId, {
    success: function(event) {
        event.destroy();
        response.success('Successfully deleted event.');
    },
    error: function(error) {
        response.error('Could not find the event.');
    }
});
});

The function finishes with the success call in the logs, but user.destroy() never actually deletes the user.

I console.log all of the params, IDs, and arguments to make sure I'm getting the expected. Is there a special way to delete Parse users?

This suddenly stopped working last week.

I've tried on Parse v1.6.14 and v1.9.2

Thanks in advance for the help!


Solution

  • As someone said, Parse.Cloud.useMasterKey() is deprecated in parse-server. You now need to specify useMasterKey flag, or pass a sessionToken (to impersonate User) to methods accessing DB (get, save, first, count,...). So, change your code accordingly:

    Parse.Cloud.define('deleteUser', function(request, response) {
    var objectId = request.params.objectId;
    
    if(!objectId || objectId.length === 0 || !objectId.trim()) {
        response.error("The user object id is needed to perform this action.");
    }
    
    var query = new Parse.Query(Parse.User);
    query.get(objectId, {
      useMasterKey: true, //HERE (1/2)
      success: function(user) {
        user.destroy({
          useMasterKey: true, //HERE (2/2)
          success: response.success(user),
          error: function(user, error) {
            response.error(error);
          }
        });
      },
      error: function(error) {
        response.error("Could not find the user.");
      }
    });
    });