javascript - Parse.com 主 key 不允许写入 PFUser currentUser

标签 javascript objective-c parse-platform

更新:简而言之,我想使用主 key ,因为我需要用我当前的用户编写另一个用户对象,但我不想覆盖所有安全性,我只想在一个中使用它功能。 this question 中接受的答案给出了一个非常好的起点,但是我无法让它工作。这是这个问题的最后一个代码块。


我有两个独立的功能。第一个是纯 objective-c,它从 currentUserfirstRelation 中删除用户。在我将不同的 CloudCode 函数添加到不同的 View Controller 之前,它运行良好,没有任何问题。 CloudCode 函数使用主 key 并将 currentUser 添加到 otherUsersampleRelation 并将 otherUser 添加到 currentUsersampleRelation(firstRelationsampleRelationUser 类中的两个不同列)。

所以问题是当我从 currentUserfirstRelation(与当前用户)中删除用户时,我的应用程序崩溃了,因为用户必须通过 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/

相关文章:

javascript - 将变量设置为 Promise 中解析查询的结果仅显示响应中的第一项

java - getParseFile(string key) 使用扩展的 ParseObject 类从 Parse.com 返回 null

android - 在 Android 应用程序中存储 key 的最佳方式

javascript - Firebase 密码验证不起作用

javascript - 太妃糖数据库对我的多列进行排序

ios - super 初始化返回 nil

ios - 无法在 iOS 中将 XMPPFramework 连接到 Openfire 服务器

javascript - jqGrid (v4.1.2) 树网格的排序不适用于邻接模型

javascript - 将方法分配给函数内部或外部原型(prototype)的区别

objective-c - NSMutableArray - 强制数组只保存特定的对象类型