我在Parse上保存对象之前尝试进行简单的检查。 我使用" beforeSave"在保存之前检查对象是否正确设置了必要字段的方法。
问题在于,当我尝试获取对象的字段时,即使在日志中正确设置,它也始终未定义!
Input: {"original":null,"update":{"ACL":{"abcdefghi":{"read":true,"write":true}},"isDeleted":false,"lastEdit":0,"name":"testobject","uuid":"109d0b30-1ad5-408b-ba49-2ce024935476"}}
和云代码:
Parse.Cloud.beforeSave("MyObject", function (request, response) {
// return always an error with uuid printed
response.error("Object uuid: " + request.object.get("uuid"));
}
这是一个示例代码,而不是我的真实代码,但正如您所看到的,传递给此函数的对象具有" uuid" field里面但是request.object.get(" uuid")总是返回" undefined":
控制台日志:
Result: Object uuid: undefined
官方文档说以这种方式访问对象字段,这是一个Parse bug还是我犯了一些错误?
编辑1:
如我所知,我试图以这种方式记录对象:
console.log("Object: " + JSON.stringify(request.object));
console.log("Request: " + JSON.stringify(request));
结果是:
Object: {}
Request: {"object":{}, <some other fields..>}
有什么想法吗?
编辑2:
我正确地重现了错误,它似乎是ACL的错误; 首先,我创建了一个扩展ParseObject的新对象(我在Android上工作):
@ParseClassName("Person")
public class ParsePerson extends ParseObject {
public void setName(String name) {
put("name", name);
}
public void setAge(int age) {
put("age", age);
}
public String getName() {
return getString("name");
}
public int getAge() {
return getInt("age");
}
}
而且我的后台线程将以这种方式创建并保存测试对象:
ParsePerson parsePerson = new ParsePerson();
parsePerson.setName("Tom");
parsePerson.setAge(45);
try {
parsePerson.save();
} catch (ParseException e) {
Debug.e("Error code: "+ e.getCode(), e);
}
我上传的这个云代码只有日志:
Parse.Cloud.beforeSave("Person", function (request, response) {
// log person object
console.log("Object: " + JSON.stringify(request.object));
// respond always success to save the object
response.success();
});
Parse.Cloud.afterSave("Person", function(request) {
// log person object again
console.log("Object: " + JSON.stringify(request.object));
// respond success
response.success();
});
运行后,它可以正常保存新表中的对象。日志:
Input: {"original":null,"update":{"age":45,"name":"Tom"}}
Result: Update changed to {"age":45,"name":"Tom"}
Object: {"age":45,"name":"Tom"}
我尝试做的最后一件事是将ACL设置为此对象,以这种方式编辑android代码:
ParsePerson parsePerson = new ParsePerson();
parsePerson.setName("Tom");
parsePerson.setAge(45);
parsePerson.setACL(new ParseACL(ParseUser.getCurrentUser())); // new line
try {
parsePerson.save();
} catch (ParseException e) {
Debug.e("Error code: "+ e.getCode(), e);
}
运行完所有内容后,这就是日志:
Input: {"original":null,"update":{"ACL":{"userAcl":{"read":true,"write":true}},"age":45,"name":"Tom"}}
Result: Update changed to {}
Object: {}
这就够了吗?
编辑3:
我找到的唯一解决方案(这是一种解决方法)是从Android代码中保存没有ACL的对象,然后在云代码上的beforeSave中设置ACL:
Parse.Cloud.beforeSave("Person", function (request, response) {
// setup ACL for this object
var user = request.user;
var newACL = new Parse.ACL();
newACL.setPublicReadAccess(false);
newACL.setPublicWriteAccess(false);
newACL.setReadAccess(user.id, true);
newACL.setWriteAccess(user.id, true);
request.object.setACL(newACL);
// log person object again
console.log("Object: " + JSON.stringify(request.object));
}
答案 0 :(得分:1)
我有一个非常类似的问题。我正在对现有项目进行更改,当我上传代码时,我开始收到错误,之前没有错误。
我终于通过在.parse.project中将jssdk版本恢复为1.4.0来解决它
也许它也解决了你的问题。