如何在Parse Cloud Functions中修改查询所得对象变量再返回给应用端
问题原因
Parse 查询返回的结果是Parse.Object类的实例,不是普通JS对象,它重写了序列化逻辑:
直接用点语法给实例挂载的自定义属性不属于Parse托管的字段范围,调用JSON.stringify时只会输出数据库中查询到的原生字段,你额外添加的isFavorite不会被序列化到最终结果中。
解决方案
有两种常用实现方式,可按需选择:
方式1:转为普通JS对象后修改(推荐,无额外依赖)
先调用toJSON()方法把Parse对象转为普通JS对象,之后就可以用常规点语法修改属性:
Parse.Cloud.define("getUserData", async(request) => { // 获取用户数据 const userQuery = new Parse.Query("UserData"); userQuery.equalTo("userId", request.params.userId); const userData = await userQuery.first(); // 获取群组数据 const groupQuery = new Parse.Query("GroupMembers"); groupQuery.equalTo("userId", request.params.userId); groupQuery.include('pointerObject'); const groups = await groupQuery.find(); const allGroups = []; for (let i = 0; i < groups.length; ++i) { // 转为普通JS对象后再修改 var thisGroup = groups[i].get("pointerObject").toJSON(); thisGroup.isFavorite = true; allGroups.push(thisGroup); } // 无需手动转JSON,Parse云函数会自动序列化返回结果 return { "playerData": userData?.toJSON(), // 建议也转成普通对象保持格式统一 "playerGroups": allGroups }; });
方式2:使用Parse内置的set方法添加字段
用Parse.Object自带的set方法添加字段,字段会被纳入Parse的托管范围,序列化时会自动带出,不需要调用save方法也不会把该字段写入数据库:
// 仅修改循环内逻辑即可 for (let i = 0; i < groups.length; ++i) { var thisGroup = groups[i].get("pointerObject"); thisGroup.set("isFavorite", true); allGroups.push(thisGroup); }
额外优化建议
不要手动调用JSON.stringify处理返回值,Parse云函数会自动将返回的JS对象序列化为符合接口规范的JSON格式,你手动序列化后前端收到的会是字符串类型,还需要额外做一次JSON解析反而增加冗余逻辑。
内容的提问来源于stack exchange,提问作者Mansa
相关产品推荐
相关产品推荐

