2014-11-05 134 views
1

有誰知道如何從beforeSave函數返回一個錯誤。例如,如果我的beforeSave功能如下:從Parse.Cloud.beforeSave返回錯誤消息到Unity

Parse.Cloud.beforeSave("UserData", function(request, response) { 
var currentSaveVersion = request.object.get("SaveVersion"); 


var query = new Parse.Query("UserData"); 
query.equalTo("Username", request.object.get("Username")); 
query.find({ 
    success: function(results) { 
     var lastSaveVersion = -1000; 
     for (var i = 0; i < results.length; ++i) { 
     lastSaveVersion = results[i].get("SaveVersion"); 
     } 

     if(currentSaveVersion == (lastSaveVersion + 1)) { 
     console.log("UserData BeforeSave success"); 
     response.success({ "success": "Successful save" }); 
     } else { 
      var errorMessage = "UserData BeforeSave SaveVersion Mismatch"; 
      console.log(errorMessage); 
      //we need to respond with success to unity, but examine the return value for the error 
      response.success({ "code": "SaveMismatch", "message": errorMessage }); 
     } 

    }, 
    error: function(user,error) { 
     var errorMessage = "UserData BeforeSave Could not look up lastSaveVersion"; 
     console.log(errorMessage); 
     response.error(errorMessage); 
     if (error.code >= 200 && error.code < 300) { 
     // Unity Hack 
     response.success({ "code": error.code, "message": error.message }); 
     } else { 
     response.error({ "code": error.code, "message": error.message }); 
     } 
    } 
}); 

}); 

不幸的是團結認爲它是成功的,但因爲System.Threading.Task類沒有被提到的財產歸還我不能得到的返回值回在相關的帖子here

這裏是我想用它來看看,有可能是在response.success消息中發送一個錯誤統一側面雲...這裏是無法編譯的例子:

系統。 Threading.Tasks.Task task = myUserData.SaveAsync();

while (!task.IsCompleted) yield return null; 

    if (task.IsCanceled){ 
     // the save was cancelled. 
     Debug.Log ("ParseManager.cs saveUserData, task cancelled"); 
    } else if (task.IsFaulted) { 
     // The login failed. Check task.Exception to see why. 
     Debug.Log ("ParseManager.cs saveUserData, task exception: "); 
     debugLogException(task); 

    } else { 
     // the object was saved successfully. 
     Debug.Log ("ParseManager.cs saveUserData, save successful "); 
     Debug.Log ("Task result: " + task.Result); 
     newUserSaveNeeded = false; 
    } 

請注意,System.Threading.Tasks.Task沒有Result屬性。 SaveAsync返回的正確C#類型是什麼,可以讓我看到結果?

或者我在談論這一切都是錯誤的?

回答

0

好的,這裏有一些事情正在進行。

首先出現在統一的堆棧一個已知的bug這意味着解析無法從雲中獲取詳細的錯誤信息:

https://www.parse.com/questions/unity-sdk-handling-errors

所以它不會不管你從什麼返回錯誤回你雲代碼,所有你會在Unity中得到的是一個沒有錯誤信息的通用錯誤(是的,這是令人難以置信的令人沮喪,但我聽說,當Unity獲得它的新編譯器,這將被修復)。

其次,你可以在你的錯誤消息只返回一個字符串,它應該返回就好了:

response.error("something bad happened!"); 

我總是寫單元測試使用Parse.com在C#單元測試項目我的雲代碼.NET SDK這不支持自定義錯誤消息(和異步/等待),像下面這樣:

[TestFixture] 
public class SaveUserTests 
{ 
    [SetUp] 
    public async void Init() 
    { 
     TestingHelpers.InitParse(); 
     ParseUser.LogOut(); 
    } 

    [Test] 
    [ExpectedException(ExpectedMessage = "Must supply a player name when creating a new user")] 
    public async void RequiresPlayerName() 
    { 
     var user = new GameUser() 
     { 
      Username = TestingHelpers.GetRandomUserEmail(), 
      Password = "a" 
     }; 
     await user.SignUpAsync(); 
    } 

    [Test] 
    [ExpectedException(ExpectedMessage = "Username and email address must be equal")] 
    public async void UsernameAndEmailMustBeEqual() 
    { 
     var user = new GameUser() 
     { 
      Username = TestingHelpers.GetRandomUserEmail(), 
      Email = TestingHelpers.GetRandomUserEmail(), 
      Password = "a", 
      PlayerName = "Test User" 
     }; 
     await user.SignUpAsync(); 
    } 
} 

這樣,我可以肯定的是雲代碼是做什麼的,應該做的事情。

BTW我保存用戶的雲代碼如下所示(寫在打字稿):

Parse.Cloud.beforeSave("_User", (request, response) => { 

    // Must have a player name 
    if (request.object.get("playerName") == null) 
     return response.error("Must supply a player name when creating a new user"); 

    // Email and username must equal 
    if (request.object.get("email") != request.object.get("username")) 
     return response.error("Username and email address must be equal"); 

    // All done 
    response.success(); 
}); 

現在,我最近遇到的是我還沒有能夠在一個簡單的例子來複制問題Parse.com Unity SDK似乎正在消耗從雲代碼返回的錯誤,而在事實上發生錯誤時返回成功!

這顯然是非常糟糕的,不應該發生,因爲我說我無法複製它在一個簡單的例子,但如果你遇到同樣的事情,那麼請寫一個錯誤報告,並提交給解析得到修復。

我懷疑(使用ILSpy反編譯ParseSDK之後)是Parse本身拋出了一個異常,該異常被某個處理程序捕獲。

我的問題的解決方法是檢查是否已設置objectId(我正在創建一個對象,因此objectId還沒有設置),如果它沒有,從我的服務返回一個錯誤。一個討厭的黑客,但它現在工作。

反正我希望有幫助!