将项目附加到获取项目的数组中解析云代码

Append item to array of fetched item Parse Cloud Code


在我的应用程序中,User 可以请求加入另一个 Users 帐户。其伪代码如下:

  1. 发送我们要加入的帐户的username
  2. 搜索数据库中是否存在username
  3. if no return
  4. if yes 创建一个新的 AccountRequest 对象
  5. 将新创建的 AccountRequest 对象添加到我们正在搜索的用户。

我可以完成第 1-4 步,但在完成第 5 步时遇到问题。

这是我正在使用的代码。

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

  console.log("-sendAccountAdditionRequest");

  // Create the query on the User class
  var query = new Parse.Query(Parse.User);

  // Set our parameters to search on
  query.equalTo("username", request.params.adminUsername);

  // Perform search
  query.find({

    // We found a matching user
    success: function(results) {

        Parse.Cloud.useMasterKey();

        var fetchedUser = results[0]

        console.log("--found user");
        console.log("--creating new AccountRequest");

        // Create a new instance of AccountRequest
        var AccountRequestClass = Parse.Object.extend("AccountRequest");
        var accountRequest = new AccountRequestClass();

        // Set the User it is related to. Our User class has a 1..n relationship to AccountRequest
        accountRequest.set("user", fetchedUser);

        // Set out other values for the AccountRequest
        accountRequest.set("phone", request.params.adminUsername);
        accountRequest.set("dateSent", Date.now());

        // Save the new AccountRequest
        accountRequest.save(null,{

            // Once the new AccountRequest has been saved we need to add it to our fetched User
            success:function(savedRequest) { 

                console.log("---adding AccountRequest to fetched User");

                //
                // === This is where stuff breaks
                //

                var requestRelation = fetchedUser.relation("accountRequest");

                // Now we need to add the new AccountRequest to the fetched User. The accountRequest property for a User is array...I'm not sure how I'm suppose to append a new item to that. I think I need to somehow cast results[0] to a User object? Maybe? 
                requestRelation.add(savedRequest);

                // We perform a save on the User now that the accountRequest has been added.
                fetchedUser.save(null, {

                    success:function(response) { 
                        console.log("----AccountRequest complete");
                        response.success("A request has been sent!");
                    },

                    error:function(error) {
                        // This is printing out: ParseUser { _objCount: 2, className: '_User', id: 'QjhQxWCFWs' }
                        console.log(error);
                        response.error(error);
                    }
                });


                //
                // ================================
                //


                //response.success("A request has been sent!");
            },

            // There was an error saving the new AccountRequest
            error:function(error) {
                response.error(error);
            }
        });
    },

    // We were not able to find an account with the supplied username
    error: function() {
      response.error("An account with that number does not exist. Please tell your administrator to sign up before you are added.");
    }
  });
});

我认为我的问题是从初始查询的 returned 搜索结果中获取 accountRequest 关系。另外要注意的是,我还没有创建我的 PFUseraccountRequest 属性,我的理解是,当我执行 save 函数时,这将由 Parse 自动完成.

是否会为您创建 accountRequest 取决于是否设置了 class 级权限以允许客户端应用程序添加字段。对于您的 Parse.User.

,这可能设置为 NO

但是 Parse.User 上的关系无论如何都不需要,因为您已经在 AccountRequest class 上建立了它。给定一个用户,您可以通过以下方式获取它的 accountRequests:

PFQuery *query = [PFQuery queryWithClassName:@"AccountRequest"];
[query whereKey:@"user" equalTo:aUser];
query.find()...

这相当于获取 User 的关系,获取其查询并 运行 它。

关于您的代码的几点注意事项:(a) findOne 会在您知道只有一个结果时为您省去一行,(b) 使用 Parse.Promise 会真正让事情变得井井有条。