解析云代码 request.object.get(key) 总是返回 undefined

Posted

技术标签:

【中文标题】解析云代码 request.object.get(key) 总是返回 undefined【英文标题】:Parse cloud code request.object.get(key) return always undefined 【发布时间】:2015-09-11 19:28:09 【问题描述】:

我正在尝试在 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”字段,但 request.object.get("uuid") 总是返回“undefined”:

控制台日志:

Result: Object uuid: undefined

官方文档说以这种方式访问​​对象字段,那么这是 Parse 错误还是我做错了什么?

编辑 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));

【问题讨论】:

你为什么不登录JSON.stringify(request.object) 我试过了,它似乎是一个空对象 。作为第二个测试,我尝试了:console.log(JSON.stringify(request));它包含空对象。所以我认为这是一个解析错误。 在我们总结bug之前,如何证明你的代码可以保存一个对象。从一个空表开始,创建并保存一个对象,使用数据浏览器证明所有数据都在那里。然后添加 only 日志的 afterSave。如果您可以显示数据浏览器中出现了一个新对象,但该 request.object 在 afterSave 中未定义,那么您可能有一个错误。但请考虑可能性 - 这是成熟服务中的主流功能,您可能刚刚跟上速度。现在,我打赌反对 parse.com 错误。 我在 Parse.beforeSave 方法上遇到了与您相同的错误,因此该错误不仅限于您。当我尝试调用 request.object.get("column") 我收到错误 I2015-09-12T06:57:57.285Z]Data : undefined。但是,在我的 android 日志中,我可以看到数据被正确传递给云代码。另外,当我尝试直接从解析网络应用程序本身编辑数据时,我可以看到我的云日志数据被正确传递 I2015-09-12T07:07:30.580Z] 数据:笔记本电脑。所以我想从android应用程序调用时可能存在错误。如果我找到解决方案,会更新您。 是的,我只在为要保存的对象设置了 ACL 并且触发了 beforeSave 方法时才注意到这个错误。如果未设置 ACL 或者如果我从 parseCloud 中删除 beforeSave 方法,它会完美运行。所以我认为这是一个错误。如果您发现一些解决方法,请告诉我!谢谢 【参考方案1】:

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

我终于在 .parse.project 中回到 jssdk 版本到 1.4.0 解决了这个问题

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

【讨论】:

我认为这是有原因的,但是如果他们有一个 Node 库,他们为什么要让人们无法使用 Node?如果是这样,他们就不能清楚地传达吗?

以上是关于解析云代码 request.object.get(key) 总是返回 undefined的主要内容,如果未能解决你的问题,请参考以下文章

解析云代码如何与解析服务器一起工作?

解析云代码错误 - “需要主密钥”?

解析云代码给我代码:141 错误

解析 iOS SDK + 云代码:如何更新用户

解析从云代码向特定用户发送推送通知

云代码的解析服务器问题。