2014-11-05 131 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还没有设置),如果它没有,从我的服务返回一个错误。一个讨厌的黑客,但它现在工作。

反正我希望有帮助!