2016-09-16 82 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