有谁知道如何从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 });
}
}
});
});
不幸的是,Unity认为它是成功的,但我无法获得返回值,因为System.Threading.Task类没有相关帖子here中提到的Return属性。
这是Unity端云,我正在尝试使用它来查看response.success消息中可能发送的错误...这是一个无法编译的示例:
System.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 :(得分:0)
好的,这里有几件事情。
首先,Unity堆栈中存在一个已知错误,这意味着Parse无法从云端获取详细的错误消息:
https://www.parse.com/questions/unity-sdk-handling-errors
因此,从云代码返回的错误并不重要,您在Unity中获得的所有内容都是一般性错误而没有错误消息(是的,这非常令人沮丧,但我听说当Unity获得它的新内容时编译器这将是固定的。)
其次,您只能在错误消息中返回一个字符串,它应该返回正常:
response.error("something bad happened!");
我总是使用支持自定义错误消息(和async / await)的Parse.com .NET SDK在C#Unit Test项目中为我的云代码编写单元测试,如下所示:
[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我保存用户的云代码如下所示(用Typescript编写):
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(我正在创建一个Object,因此还没有设置objectId),如果没有设置,则从我的服务中返回错误。一个讨厌的黑客,但它现在有效。
无论如何,我希望有所帮助!