2014-11-05 4 views
1

Кто-нибудь знает, как получить сообщение об ошибке из функции beforeSave. Например, если моя функция BeforeSave выглядит следующим образом:Получение сообщения об ошибке из Parse.Cloud.beforeSave to 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 }); 
     } 
    } 
}); 

}); 

К сожалению, Unity считает, что она будет успешной, но я не могу получить возвращаемое значение обратно, потому что класс 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. Каков правильный тип C#, возвращаемый SaveAsync, который позволит мне увидеть результат?

Или я все об этом не так?

ответ

0

Хорошо, здесь есть несколько вещей.

Во-первых, это известная ошибка в стеке Unity, что означает, что Анализировать не может получить подробные сообщения об ошибках из облака:

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

Так что не имеет значения, какую ошибку вы вернетесь назад от вашего облачный код, все, что вы получите в Unity, является общей ошибкой без сообщения об ошибке (да, это невероятно сложно, но я слышал, что когда Unity получит свой новый компилятор, это будет исправлено).

Во-вторых, вы можете вернуть только строку в сообщении об ошибке, и он должен вернуться просто отлично:

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

Я всегда пишу тесты для моего облака кода в C# Unit Test проект с использованием Parse.com .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, похоже, потребляет ошибку, возвращенную из кода облака, и вместо этого возвращает успех, когда это было ошибкой!

Очевидно, что это невероятно плохо и не должно произойти, и, как я уже сказал, я не смог воспроизвести его на простом примере, но если вы испытываете то же самое, пожалуйста, напишите отчет об ошибке и отправьте его для разбора для исправления.

Мое подозрение (после декомпиляции ParseSDK с помощью ILSpy) заключается в том, что сам синтаксис бросает исключение, которое где-то улавливается обработчиком.

Мое решение проблемы состояло в том, чтобы проверить, установлен ли объект Id (я создавал объект и, следовательно, objectId еще не был установлен), а если он этого не сделал, верните ошибку из моей службы. Отвратительный взлом, но сейчас он работает.

В любом случае, я надеюсь, что это поможет!