我是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)
提前感谢任何人提供的任何帮助。
答案 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以包括当前用户和所请求的朋友。这样他们都可以访问它。