Unity3d 从Parse.Cloud.beforeSave返回错误消息到Unity

Unity3d 从Parse.Cloud.beforeSave返回错误消息到Unity,unity3d,parse-platform,Unity3d,Parse Platform,是否有人知道如何从beforeSave函数返回错误。例如,如果我的beforeSave函数如下所示: Parse.Cloud.beforeSave("UserData", function(request, response) { var currentSaveVersion = request.object.get("SaveVersion"); var query = new Parse.Query("UserData"); query.equalTo("Username", reque

是否有人知道如何从beforeSave函数返回错误。例如,如果我的beforeSave函数如下所示:

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.Tasks.Task没有结果属性。SaveAsync返回的正确C#类型是什么,允许我查看结果


还是我完全错了?

好吧,这里有几件事

首先,Unity的堆栈中存在一个已知错误,这意味着Parse无法从云中获取详细的错误消息:

因此,无论您从云代码返回什么错误,在Unity中得到的只是一个没有错误消息的一般错误(是的,这令人难以置信地沮丧,但我听说当Unity获得新的编译器时,这将得到修复)

其次,您可以在错误消息中只返回一个字符串,它应该返回得很好:

response.error("something bad happened!");
我总是使用Parse.com.NET SDK在C#单元测试项目中为我的云代码编写单元测试,该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();
    }
}
这样,我可以确定云代码正在做它应该做的事情

顺便说一句,用于保存用户的my cloud代码如下所示(用Typescript编写):

现在,我最近遇到了一个我无法在一个简单示例中复制的问题,Parse.com Unity SDK似乎正在使用从云代码返回的错误,而不是在它实际上是一个错误时返回成功

这显然是非常糟糕的,不应该发生,正如我所说,我无法在一个简单的例子中复制它,但如果您遇到同样的问题,请编写一个错误报告,并提交给解析以得到修复

我怀疑(在使用ILSpy对ParseSDK进行反编译之后)解析本身正在抛出一个异常,该异常正被某个处理程序捕获

我解决这个问题的方法是检查objectId是否已设置(我正在创建一个对象,因此objectId尚未设置),如果未设置,则从我的服务返回一个错误。一个讨厌的黑客,但它现在起作用了

不管怎样,我希望这有帮助

[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();
    }
}
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();
});