无法在Cloud Code中使用用户ACL保存ParseObject

时间:2016-09-16 14:32:37

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

我在从云代码功能中保存对象的更改时遇到问题。

我有一个名为Character的集合,里面有一个记录。 此字符记录具有公共读取的ACL,以及特定ParseUser(6MwfSLdAxd)的专用写入访问

在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设置为公开写入

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

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

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]

1 个答案:

答案 0 :(得分:1)

经过一番广泛的搜索后,我现在找到了解决方法。 对于遇到相同问题的其他人,您应该知道,虽然Parse.com曾经在调用它们的用户(afaik)的上下文中运行Cloud Code函数,但自托管的Parse Server却没有。

要在用户的上下文中调用查询或保存,您必须传递其会话令牌,如下所示。我希望这可以节省一些人经历的困惑时间!

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