Javascript CloudCode系列承诺,帮助函数给出错误“;对象没有方法';应用'&引用;

Javascript CloudCode系列承诺,帮助函数给出错误“;对象没有方法';应用'&引用;,javascript,node.js,parse-platform,promise,parse-cloud-code,Javascript,Node.js,Parse Platform,Promise,Parse Cloud Code,我是JavaScript新手,我正在尝试让我的第一批云代码正常工作。我已经创建了一个helper函数deleteFriendRequest,因为我希望其他函数使用它。我写的东西很管用,但是我抛出了一个错误 我的助手功能: function deleteFriendRequest(requestObjectId) { // create query to find FriendRequest from its objectId var requestQuery = new Pars

我是JavaScript新手,我正在尝试让我的第一批云代码正常工作。我已经创建了一个helper函数
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);
        });

});

当我运行
createFriendly
时,出现以下错误:

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)

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

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

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

表达式

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

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

尝试:

更进一步

deleteFriendRequest()
中的大部分内容是对
friendRequestObj
的派生,这是调用方函数中已经完成的工作的重复,因此除非在应用程序的其他地方需要
deleteFriendRequest()
,否则该行
将返回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);
});
Parse.Cloud.define(“createFriendly”),函数(请求、响应){
Parse.Cloud.useMasterKey();
var requestQuery=newparse.Query(“FriendRequest”);
requestQuery.equalTo(“objectId”,request.params.friendRequestObjectId);
requestQuery.include(“fromUser”);
requestQuery.first()
.then(函数(friendRequestObj){
var fromUser=friendRequestObj.get(“fromUser”);
request.user.relation(“friendsRelation”).add(fromUser);
fromUser.relation(“friendsRelation”).add(request.user);
//这两个保存最有可能并行执行
返回Parse.Promise.when(
request.user.save(),
fromUser.save()
)
.然后(函数(){

return friendRequestObj.destroy();//
createFriendly
的工作原理是它创建了所需的关系并删除了好友请求,但我得到了那个错误,所以我的Android客户端得到了一个异常并认为该功能失败。这似乎与访问无关,因为它在这方面做了它应该做的事情。想法?你给出的不会有帮助lve由于Parse.js源代码中的错误很深,所以请解决此问题。
apply()
是函数对象的一种方法。您可能正在传递一个对象,而您应该在其中传递一个函数。谢谢,这在很多方面确实帮助了我的理解。您最后的“继续…”建议似乎最适合这份工作,但我仍然得到了
成功/错误,当事情正常运行时,没有调用
,因此我缺少了
响应。成功
。这里最适合放在哪里?好的一点是,
响应。成功
没有调用。倒数第二行中,一个
null
移位
响应.error
排在.then()参数列表的第二位。
null
实际上应该用一个函数替换。最简单的方法是
response.success
。要真正提供成功消息,您需要类似
的内容。然后(function(){response.success(“我的成功消息”);},response.error)
让我知道这是否有效,我会编辑我的答案。用
响应替换
null
。成功满足我的需要。非常感谢您的帮助!!
.then(deleteFriendRequest.bind(null, friendRequestId))
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);
});