我在从云代码功能中保存对象的更改时遇到问题。
我有一个名为Character的集合,里面有一个记录。
此字符记录具有公共读取的ACL,以及特定ParseUser(6MwfSLdAxd
)的专用写入访问。
在Unity中,我对用户进行了身份验证,然后按如下方式调用Cloud Code函数:
ParseCloud.CallFunctionAsync<Character>("startBattle", null).ContinueWith(t =>
{
Debug.Log("I got here...");
Debug.Log(t.Result.ClassName);
});
在我的Cloud Code功能中,我抓住了集合中的第一个字符(忽略检查它是否属于这个用户,因为目前只有一个,并且它属于这个用户 - 那里只有一个用户也是。)
var Character = Parse.Object.extend("Character");
Parse.Cloud.define("startBattle", function (request, response) {
var user = request.user;
if (user == null)
{
return response.error("You must login before you can battle!");
}
var characterQuery = new Parse.Query(Character);
characterQuery.first()
.then(
function (character) {
character.set("name", "Cloud Code sucka");
character.save().then(function(character) {
return response.success(character);
});
},
function (error) {
return response.error("You must create a character before you can battle! " + error);
}
)
});
但是,我根本无法保存对此角色的任何更改。我发现的所有文档和论坛帖子都表明,如果您在通过身份验证时调用Cloud Code函数,那么该函数应具有与用户调用它相同的级别权限。
此代码唯一有效的时间是我将字符的ACL设置为公开写入。
有没有人知道为什么这不起作用?
注意:值得注意的是,我可以在服务器日志中看到经过身份验证的用户6MwfSLdAxd
正在调用Cloud Code函数,因为我收到此错误(如果我添加了response.error调用):
error: Failed running cloud function startBattle for user 6MwfSLdAxd with:
Input: {}
Error: {"code":141,"message":"Messed up: [object Object]"} functionName=startBattle, code=141, message=Messed up: [object Object], , user=6MwfSLdAxd
error: Error generating response. ParseError { code: 141, message: 'Messed up: [object Object]' } code=141, message=Messed up: [object Object]
[object Object]
[object Object]
答案 0 :(得分:1)
经过一番广泛的搜索后,我现在找到了解决方法。 对于遇到相同问题的其他人,您应该知道,虽然Parse.com曾经在调用它们的用户(afaik)的上下文中运行Cloud Code函数,但自托管的Parse Server却没有。
要在用户的上下文中调用查询或保存,您必须传递其会话令牌,如下所示。我希望这可以节省一些人经历的困惑时间!
var MyObject = Parse.Object.extend("MyObject");
Parse.Cloud.define("myCloudFunction", function (request, response) {
var user = request.user;
var sessionToken = user.getSessionToken();
var query = new Parse.Query(MyObject)
.find({ sessionToken: sessionToken })
.then(
function (object) {
object.set("someKey", "someValue");
return object.save(null, { sessionToken: sessionToken });
}
)
.then(
function (object) {
return response.success(object);
},
function (error) {
return response.error(error.message);
}
);
});
有关进一步的背景,请参阅:
https://github.com/ParsePlatform/parse-server/wiki/Compatibility-with-Hosted-Parse#cloud-code