【问题标题】:Unable to Save ParseObject with User ACL in Cloud Code无法在 Cloud Code 中使用用户 ACL 保存 ParseObject
【发布时间】:2016-09-16 14:32:36
【问题描述】:

我在从 Cloud Code 函数保存对对象的更改时遇到问题。

我有一个名为 Character 的集合,其中有一个记录。 此字符记录有一个 ACL,具有 Public Read 和特定 ParseUser (6MwfSLdAxd) 的 Private Write Access

在 Unity 中,我对用户进行了身份验证,然后调用 Cloud Code 函数,如下所示:

ParseCloud.CallFunctionAsync<Character>("startBattle", null).ContinueWith(t =>
{
    Debug.Log("I got here...");
    Debug.Log(t.Result.ClassName);
});

在我的 Cloud Code 函数中,我抓取了集合中的第一个字符(忽略检查它是否属于该用户,因为目前只有一个并且它确实属于该用户 - 也只有一个用户)。

var Character = Parse.Object.extend("Character");

Parse.Cloud.define("startBattle", function (request, response) {
    var user = request.user;
    if (user == null)
    {
        return response.error("You must login before you can battle!");
    }

    var characterQuery = new Parse.Query(Character);
    characterQuery.first()
    .then(
        function (character) {
            character.set("name", "Cloud Code sucka");
            character.save().then(function(character) {
                return response.success(character);
            });
        },
        function (error) {
            return response.error("You must create a character before you can battle! " + error);
        }
    )
});

但是,我根本无法保存对这个角色的任何更改。我发现的所有文档和论坛帖子都表明,如果您在通过身份验证时调用 Cloud Code 函数,那么该函数应该与调用它的用户具有相同级别的权限。

此代码唯一有效的情况是我将角色的 ACL 设置为 Public Write

有没有人知道为什么这不起作用?

注意:值得注意的是,当我收到此错误(如果我添加 response.error 调用)时,我可以在服务器日志中看到经过身份验证的用户 6MwfSLdAxd 正在调用云代码函数:

error: Failed running cloud function startBattle for user 6MwfSLdAxd with:
  Input: {}
  Error: {"code":141,"message":"Messed up: [object Object]"} functionName=startBattle, code=141, message=Messed up: [object Object], , user=6MwfSLdAxd
error: Error generating response. ParseError { code: 141, message: 'Messed up: [object Object]' } code=141, message=Messed up: [object Object]
[object Object]
[object Object]

【问题讨论】:

    标签: unity3d parse-platform parse-cloud-code parse-server


    【解决方案1】:

    经过一些广泛的搜索,我现在找到了解决方案。 对于遇到相同问题的其他人,您应该知道,虽然 Parse.com 过去常常在调用它们的用户上下文中运行云代码函数 (afaik),但自托管 Parse 服务器却没有。

    为了在用户上下文中调用查询或保存,您必须传递他们的会话令牌,如下所示。我希望这可以节省我经历的几个小时的困惑!

    var MyObject = Parse.Object.extend("MyObject");
    
    Parse.Cloud.define("myCloudFunction", function (request, response) {
        var user = request.user;
        var sessionToken = user.getSessionToken();
    
        var query = new Parse.Query(MyObject)
            .find({ sessionToken: sessionToken })
            .then(
                function (object) {
                    object.set("someKey", "someValue");
                    return object.save(null, { sessionToken: sessionToken });
                }
            )
            .then(
                function (object) {
                    return response.success(object);
                },
                function (error) {
                    return response.error(error.message);
                }
            );
    });
    

    更多上下文见:

    https://github.com/ParsePlatform/parse-server/wiki/Compatibility-with-Hosted-Parse#cloud-code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多