解析云代码request.object.get(key)返回始终未定义

时间:2015-09-11 19:28:09

标签: javascript android parse-platform cloud-code

我在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));
}

1 个答案:

答案 0 :(得分:1)

我有一个非常类似的问题。我正在对现有项目进行更改,当我上传代码时,我开始收到错误,之前没有错误。

我终于通过在.parse.project中将jssdk版本恢复为1.4.0来解决它

也许它也解决了你的问题。