Parse afterFind云函数添加对象在客户端为指针,需调用fetchIfNeeded
看起来你遇到的问题是:在afterFind云函数里给PublicationImage对象附加了userVote(一个Vote对象),但客户端拿到的只是指针,必须调用fetchIfNeeded才能获取完整数据。这其实是Parse的默认行为——当你把一个Parse.Object设置到另一个对象的属性上时,Parse会自动将其存储为指针,而非嵌入完整的对象数据。
下面给你几个可行的解决方案:
方案1:将Vote对象转为JSON后再设置
直接使用Parse.Object的toJSON()方法,把Vote对象转换成普通JSON对象再附加到PublicationImage上。这样客户端拿到的就是完整的对象数据,不需要额外fetch:
// 替换原来的set语句 publicationImages[i].set("userVote", vote.toJSON());
toJSON()会把Parse对象的所有字段(包括id、createdAt、updatedAt以及你自定义的字段)都转换成普通JSON格式,客户端可以直接访问这些数据。
方案2:手动提取需要的字段(更灵活)
如果你只需要Vote对象里的部分字段,可以手动构建一个普通对象,只包含你需要的数据,这样能减少返回的数据量:
// 假设你只需要vote的id、value和作者信息 const voteData = { id: vote.id, value: vote.get("value"), authorId: vote.get("author").id, authorUsername: vote.get("author").get("username") }; publicationImages[i].set("userVote", voteData);
方案3:返回格式化后的JSON数组(彻底避免指针问题)
如果你希望整个响应都是纯JSON,不需要Parse对象的额外属性,可以把所有PublicationImage对象都转换成JSON,再附加userVote数据后返回:
// 在获取votes之后,重新格式化所有图片对象 const formattedPublicationImages = publicationImages.map(image => { // 先转成JSON const imageJSON = image.toJSON(); // 找到当前图片对应的vote const matchedVote = votes.find(vote => vote.get("target").id === image.id); if (matchedVote) { // 把vote转成JSON添加进去 imageJSON.userVote = matchedVote.toJSON(); } return imageJSON; }); // 返回格式化后的数组 response.success(formattedPublicationImages);
为什么原来的方式会返回指针?
Parse的set方法在接收Parse.Object类型的值时,会自动将其识别为关联对象指针——这是Parse为了优化数据传输和存储设计的默认行为。因为你添加的userVote并不是PublicationImage Schema中定义的关联字段,所以即使你在查询时用include也无法预加载这部分数据,必须通过上述方式手动转换为普通对象。
内容的提问来源于stack exchange,提问作者Scaraux

