解析云代码 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的主要内容,如果未能解决你的问题,请参考以下文章