beforeDelete函数失败,提示“成功/未调用错误”

Parse.com beforeDelete function failing with "success/error was not called"

本文关键字:调用 错误 成功 函数 失败 提示 beforeDelete      更新时间:2023-09-26

这不是最好的parse.com问题,但这是我第一次用javascript写东西,我不知道哪里出错了。

在我的db中,我有ParsePost s, ParseUser s和ParseComment s。当我删除一个帖子时,我希望完成以下操作:

  • 任务1:找到写帖子的用户,并减少他的"posts"计数器;
  • 任务2:删除与待删除岗位相关的所有ParseComment;
  • 任务3:找到"喜欢"该帖子的用户,并减少他们的"喜欢"计数器。

我正在尝试如下(重命名一些变量,所以可能有拼写错误):

Parse.Cloud.beforeDelete("ParsePost", function(request,response) {
  var post = request.object;
  var user = post.get("author");
  user.increment("posts",-1);
  user.save().then(function(success) {
    var query = new Parse.Query("ParseComment");
    query.equalTo("post",post);
    return query.find();
  }).then(function(comments) {
    for (var i = 0; i < comments.length; i++) {
      var comment = comments[i];
      comment.destroy();
    }
    var query2 = new Parse.Query("ParseUser");
    query2.equalTo("postsLiked",post); //"postsLiked" is a relation field
    return query2.find();
  }).then(function(users) {
    for (var i = 0; i < users.length; i++) {
      var u = users[i];
      u.increment("postsLikedCount",-1);
      u.save();
    }
    response.success();
  });
});

但是,删除失败,显示消息:Result: success/error was not called。我不知道为什么。

我处理承诺的方式,据我所知(不多),应该调用下一个then(),即使在之前的一个步骤中有错误。换句话说,这三个任务并不是真正重要的—我希望函数:

  • 尝试完成每个任务;
  • 调用success(),无论任务的输出:我希望帖子被删除,即使,说,comments.length == 0

我应该如何完成,为什么我的函数没有达到response.success() ?

作为旁注,我甚至没有找到一种调试的方法-我使用parse deploy,然后查看parse.com的日志部分,但我无法在其中写入任何内容。即,console.log()没有输出。

你的一个承诺抛出了一个错误,你没有任何。then()来捕获这个错误。then()要么接受1个或2个参数,这两个都是函数。如果只有1,则取promise的解析值。如果有2个,第二个取承诺的被拒绝值。你的一个承诺被拒绝了,但这个承诺从来没有被抓住过。将此添加到您的链的末尾:

.then( function(){},
        function(error)
        {
             response.error("There was an error: " + error.message);
        }
    );

被拒绝的承诺跳过承诺链中任何不包含错误处理程序的链接,所以在最后有这个链接将捕获来自早期链接的任何错误。即使你调用了response.success()而没有返回promise,下一个链的success函数也会被调用。你不会向变量传递任何东西,所以它将是null/undefined

编辑-看看你的代码,我打赌这将是一个很早就出现的问题。你从来没有获取过用户,所以现在它只是一个空对象,只有一个对象id。

Edit2 -同样,query.find()只返回前1000个结果。如果你想对每个对象做一些事情,你应该使用query.each()。