更新:简而言之,我想使用主 key ,因为我需要用我当前的用户编写另一个用户对象,但我不想覆盖所有安全性,我只想在一个中使用它功能。 this question 中接受的答案给出了一个非常好的起点,但是我无法让它工作。这是这个问题的最后一个代码块。
我有两个独立的功能。第一个是纯 objective-c,它从 currentUser
的 firstRelation
中删除用户。在我将不同的 CloudCode 函数添加到不同的 View Controller 之前,它运行良好,没有任何问题。 CloudCode 函数使用主 key 并将 currentUser
添加到 otherUser
的 sampleRelation
并将 otherUser
添加到 currentUser
的 sampleRelation
(firstRelation
和 sampleRelation
是 User
类中的两个不同列)。
所以问题是当我从 currentUser
的 firstRelation
(与当前用户)中删除用户时,我的应用程序崩溃了,因为用户必须通过 logIn 或 signUp 进行身份验证.实际上我不明白这一点,因为在这种情况下我正在用 currentUser
而不是另一个用户编写 currentUser
,所以它必须没有任何问题地工作(并且工作在 CloudCode 之前)。
我几乎可以肯定这是因为我在 CloudCode 中使用了主 key ,但不知道如何避免它。其他一切仍然有效,例如我可以使用 currentUser
上传图像。
这是我用于 CloudCode 的代码,我完全不知道 JavaScript,也许有人会看到导致问题的原因。
Parse.Cloud.define('editUser', function(request, response) {
Parse.Cloud.useMasterKey();
var userQuery = new Parse.Query(Parse.User);
userQuery.get(request.params.userId)
.then(function (user) {
var relation = user.relation("sampleRelation");
relation.add(request.user);
// chain the promise
return user.save();
}).then(function (user) {
var currentUser = request.user;
var relation = currentUser.relation("sampleRelation");
relation.add(user);
// chain the new promise
return currentUser.save();
}).then(function () {
response.success();
}, function (error) {
response.error(error);
});
});
当我尝试移除对象时它崩溃了:
PFUser *user = [self.friends objectAtIndex:indexPath.row];
PFRelation *myFriendsRel = [self.currentUser relationForKey:@"simpleRelation"];
if ([self isFriend:user]) {
for (PFUser *friendName in self.friends) {
if ([friendName.objectId isEqualToString:user.objectId]){
[self.friends removeObject:friendName];
break; // to exit a loop
}
}
// remove from parse
[myFriendsRel removeObject:user];
NSLog(@"deleted: %@", user.username);
}
[self.currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (error){
NSLog(@"Error %@ %@", error, [error userInfo]);
}
}];
这是最新的尝试,基于 Fosco 对另一个问题的回答。它可以工作,但与早期版本的方式相同。
Parse.Cloud.define('editUser', function(request, response) {
var userId = request.params.userId;
var User = Parse.Object.extend('_User'),
user = new User({ objectId: userId });
var currentUser = request.user;
var relation = user.relation("friendsRelation");
relation.add(currentUser);
user.save(null, { useMasterKey:true}).then(function(user) {
response.success(user);
}, function(error) {
response.error(error)
});
});
最佳答案
乍一看,它似乎失败了,因为您正试图在迭代数组时从数组中删除一个对象。我知道这会导致 Objective C 崩溃,无论您是否使用 Parse 对象。
尝试重写这个片段:
for (PFUser *friendName in self.friends) {
if ([friendName.objectId isEqualToString:user.objectId]){
[self.friends removeObject:friendName];
break; // to exit a loop
}
}
像这样:
NSMutableArray *tempArray = [[NSMutableArray alloc]init];
for (PFUser *friendName in self.friends) {
if (![friendName.objectId isEqualToString:user.objectId]) {
[tempArray addObject:friendName];
}
self.friends = [NSArray arrayWithArray:tempArray];
同样,只是快速浏览了一下,所以不是 100% 确定这是您的问题,但看起来确实如此,如果有帮助请告诉我
关于javascript - Parse.com 主 key 不允许写入 PFUser currentUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632527/