CloudCode 承诺系列,辅助函数给出错误 "Object has no method 'apply'"

CloudCode promises in series, helper function gives error "Object has no method 'apply'"

我是 JavaScript 的新手,我正在尝试让 CloudCode 的第一部分工作。我创建了一个辅助函数 deleteFriendRequest,因为我希望它能被其他函数使用。我写的东西有效,但出现错误。

我的辅助函数:

function deleteFriendRequest(requestObjectId) {
    // create query to find FriendRequest from its objectId
    var requestQuery = new Parse.Query("FriendRequest");
    requestQuery.equalTo("objectId", requestObjectId);
    return requestQuery.first().then(function(friendRequestObj) {
        return friendRequestObj.destroy();
    });

}

一个使用它的函数:

Parse.Cloud.define("createFriendship", function(request, response) {
    Parse.Cloud.useMasterKey();

    var currentUser = request.user;
    var friendRequestId = request.params.friendRequestObjectId;

    var fromUser;
    var fromRelation;

    var requestQuery = new Parse.Query("FriendRequest");
    requestQuery.equalTo("objectId", friendRequestId);
    requestQuery.include("fromUser");
    requestQuery.first().then(function(friendRequestObj) {
            fromUser = friendRequestObj.get("fromUser");
            fromRelation = currentUser.relation("friendsRelation");
            fromRelation.add(fromUser);
            return currentUser.save();
        }).then(function(friendRequestObj) {
            var toRelation = fromUser.relation("friendsRelation");
            toRelation.add(currentUser);
            return fromUser.save();
        }).then(deleteFriendRequest(friendRequestId))
        .then(function(error) {
            response.error(error);
        });

});

当我 运行 createFriendship 我得到以下错误:

Input: {"friendRequestObjectId":"qVIa9zzPR0"}
Result: TypeError: Object [object Object] has no method 'apply'
    at e (Parse.js:2:8941)
    at Parse.js:2:8390
    at Array.forEach (native)
    at Object.x.each.x.forEach [as _arrayEach] (Parse.js:1:661)
    at c.extend.resolve (Parse.js:2:8341)
    at Parse.js:2:9020
    at e (Parse.js:2:8941)
    at Parse.js:2:8390
    at Array.forEach (native)
    at Object.x.each.x.forEach [as _arrayEach] (Parse.js:1:661)

提前感谢任何人可以提供的帮助。

尝试在 deleteFriendRequest 方法中使用 Parse.Cloud.useMasterKey();。看起来当前用户可能无权访问该行。

您的另一个选择可能是在创建好友请求时尝试设置 ACL。你必须再次使用主密钥,但你可以在那个阶段设置 ACL 以包括当前用户和请求的朋友。这样他们都可以访问它。

表达式...

`.then(deleteFriendRequest(friendRequestId))` 

... 立即调用 deleteFriendRequest(friendRequestId) 并将返回的承诺传递给 .then()

但是,.then() 接受函数作为其参数,而不是承诺。

尝试:

.then(function() {
    deleteFriendRequest(friendRequestId);
})

.then(deleteFriendRequest.bind(null, friendRequestId))

更进一步...

deleteFriendRequest() 中的大部分内容是 friendRequestObj 的推导,它是调用函数中已经完成的工作的重复,因此除非在其他地方需要 deleteFriendRequest()应用程序,行 return friendRequestObj.destroy(); 可以移动到调用方,并且 deleteFriendRequest() 可以消失。

Parse.Cloud.define("createFriendship", function(request, response) {
    Parse.Cloud.useMasterKey();
    var requestQuery = new Parse.Query("FriendRequest");
    requestQuery.equalTo("objectId", request.params.friendRequestObjectId);
    requestQuery.include("fromUser");
    requestQuery.first()
    .then(function(friendRequestObj) {
        var fromUser = friendRequestObj.get("fromUser");
        request.user.relation("friendsRelation").add(fromUser);
        fromUser.relation("friendsRelation").add(request.user);

        // The two saves can most likely be performed in parallel
        return Parse.Promise.when(
            request.user.save(), 
            fromUser.save()
        )
        .then(function() {
            return friendRequestObj.destroy(); //<<<<<<<< moved here from deleteFriendRequest()
        });
    })
    .then(response.success, response.error);
});