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