Unity3d 从Parse.Cloud.beforeSave返回错误消息到Unity
是否有人知道如何从beforeSave函数返回错误。例如,如果我的beforeSave函数如下所示: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
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();
});