CloudCode承诺系列,辅助函数给出错误“对象没有方法'应用'”

时间:2015-08-18 13:23:03

标签: javascript node.js parse-platform promise cloud-code

我是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)

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

2 个答案:

答案 0 :(得分:1)

表达式......

`.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);
});

答案 1 :(得分:0)

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

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