5

クラウド コード/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 docs を使用して、これをつなぎ合わせることができました。しかし、私は本当にそれをうまくフォローしていません。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はそれぞれ1回だけ呼び出す必要があるように見えるので、関数を次のように変更しました:

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");
        }

    });


});
4

1 に答える 1

0

古い質問ですが、賛成票が投じられているため、回答すると他の誰かを助けることができるかもしれません:)。

まず、fromUser の保存方法にエラーがあります。

fromUser.save({ success: ...

APIを見ると、次の形式であることがわかります。

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

しかし、バグを見つけるのを妨げていたより大きな問題は、プロミスを使用する代わりに非同期コードを処理する古いスタイルの方法を使用しているため、エラーが発生していることです。

以下では、promise を使用するように書き直しました。ノート:

  1. 私は常に promise 生成呼び出しを返します (非同期コードでエラーをキャッチするための他のオプションがありますが、これから始めます)。
  2. .catch末尾にaを付けます。これ.catchは事実上 と同じです.then(null, response.error)が、いずれにせよ、エラーをキャッチするための最終的なバックストップが必要です。上記のコードでは、エラーは非同期で実行されていた成功ブロックにあったため、エラーが発生した場合、誰もそれを聞くことができずに失敗しました:)。

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);
});
于 2017-06-11T00:38:54.800 に答える