2016-09-16 30 views
0

我在保存云代码功能中的对象更改时遇到问题。无法使用用户ACL在Cloud代码中保存ParseObject

我有一个叫做Character的集合,里面有一条记录。 这个角色记录与公共阅读条目私有写访问由特定的ParseUser(6MwfSLdAxd)访问。

在Unity,我验证过的用户,然后我叫云代码功能如下:

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

在我的云代码功能,我抓住的第一个字符的集合(忽略检查,如果它属于这个用户,因为此刻只有一个,它属于这个用户 - 也只有一个用户)。

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称为我得到这个错误(如果我添加一个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] 

回答

0

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

相关问题