从Parse.Cloud.beforeSave返回错误消息到Unity
有谁知道如何从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#类型是什么,可以让我看到结果?
或者我在谈论这一切都是错误的?
好的,这里有一些事情正在进行。
首先出现在统一的堆栈一个已知的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还没有设置),如果它没有,从我的服务返回一个错误。一个讨厌的黑客,但它现在工作。
反正我希望有帮助!