CloudCode承诺串联,帮助函数给出错误“对象没有方法”适用“”

我是JavaScript的新手,我试图让我的第一批CloudCode工作。 我已经创build了一个帮助函数deleteFriendRequest因为我希望这可以被其他函数使用。 我写的作品,但我得到一个错误。

我的帮手function:

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

使用它的function:

 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) 

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

expression方式 …

 `.then(deleteFriendRequest(friendRequestId))` 

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

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

试试:

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

要么

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

走得更远

deleteFriendRequest()中的大部分内容是deleteFriendRequest()的派生,它是调用者函数中已经完成的重复工作,所以除非在应用程序的其他地方需要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); }); 

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

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