Parse.com云代码错误:尝试更新用户时未调用成功/错误

时间:2014-08-27 00:52:24

标签: javascript ios parse-platform cloud-code

我从未使用过云代码/ javascript而我正在尝试编写一些解析云代码来查找使用传递给云功能的objectId的用户,然后更新拥有朋友并最终保存该用户的用户关系。

下面是使用的函数:

Parse.Cloud.define("addFriendToFriendsRelation", function(request, response) {

    Parse.Cloud.useMasterKey();
    var fromUserObjectId = request.params.fromUserObjectId;
    var acceptingUser = request.params.user;
    var query = new Parse.Query(Parse.User);

  // find the user the request was from using the objectId
    query.get(fromUserObjectId, {

      success: function(user) {

        var fromUser = user
        var relation = fromUser.relation("friends");
          relation.add(acceptingUser);
          fromUser.save({

            success: function() {
              response.success("Successfully saved the users relation")
           },

           error: function() {
              response.error("Save failed");
           }

          });

      },

     error: function() {

        response.error("Save failed");
     }

    });

});

我设法使用Parse文档将它拼凑在一起。但我真的没跟好它。从未使用过javascript,我发现语法令人困惑。

然后我用

调用该函数
//fromUser is a PFUser object defined further up
[PFCloud callFunctionInBackground:@"addFriendToFriendsRelation" withParameters:@{@"fromUserObjectId" : fromUser.objectId} block:^(id object, NSError *error) {

}

然而,无论何时调用此函数,我都会获得成功/错误未被调用错误。虽然我在函数中调用response.success和response.error,所以我不知道为什么会这样?任何人都可以伸出援手吗?

编辑:在做了一些搜索后,看起来像response.success和response.error应该只调用一次,所以我修改了我的函数看起来像这样:

arse.Cloud.define("addFriendToFriendsRelation", function(request, response) {

    Parse.Cloud.useMasterKey();

    var fromUserId = request.params.fromUserObjectId;
    console.log("fromUserId:");
    console.log(fromUserId);
    var acceptingUser = request.params.user;
    console.log("acceptingUser:")
    console.log(acceptingUser);
    var query = new Parse.Query(Parse.User);

    query.get(fromUserId, {

        success: function(user) {

            console.log("found user:");
            console.log(user);
            var fromUser = user;
            var relation = fromUser.relation("friends");
            relation.add(acceptingUser);
            console.log("added accepting user to relation");
            fromUser.save({

                success: function() {

                    response.success("successfully saved user")

                },

                error: function() {

                    response.error("error saving user");
                }

            });



            console.log("found a user");

        },

        error: function() {

            console.log("error finding user");
        }

    });


});

1 个答案:

答案 0 :(得分:0)

一个老问题,但由于它已被投票,或许回答可以帮助其他人:)。

首先,您从“用户”保存的方式出错。

fromUser.save({ success: ...

如果查看api,您可以看到它应该是以下格式:

fromUser.save(null, { success: ...

但是,让你找不到错误的更大问题是错误被吃掉了,因为你正在使用处理异步代码而不是使用promises的旧式方法。

下面,我重写了使用promises。注意:

  1. 我总是返回承诺生成调用(在异步代码中还有其他选项可以捕获错误,但从这开始。)
  2. 最后加.catch.catch实际上与.then(null, response.error)完全相同,但不管怎样,必须有最终的后备来捕捉错误。在上面的代码中,错误是在成功块中,即运行异步,因此当出现错误时,它失败了,没有人听到它:)。
  3. Parse.Cloud.define("addFriendToFriendsRelation", (request, response) => {
      const fromUserId = request.params.fromUserObjectId;
      console.log("fromUserId:", fromUserId);
      const acceptingUser = request.user;
      console.log("acceptingUser:", acceptingUser)
      new Parse.Query(Parse.User);
        .get(fromUserId, { useMasterKey: true })
        .then((fromUser) => {
          console.log("found fromUser:", fromUser);
          const relation = fromUser.relation("friends");
          relation.add(acceptingUser);
          console.log("added accepting user to relation");
          return fromUser.save(null, { useMasterKey: true })
        })
          .then(response.success)
          .catch(response.error);
    });