Firestore安全规则中是否存在Map的forEach等效遍历方法?
Firestore规则校验好友列表新增字段的正确实现
首先明确两个核心结论:
- Firestore安全规则的Map类型不支持
getAll()批量取值方法 - 规则语言不支持示例里的
forEach回调式遍历写法,校验集合内所有元素符合要求需要用内置的every()方法
实现步骤
你的好友列表存储结构为Map类型,键为用户ID,值为包含displayName(字符串)、color(数字)的用户信息对象,校验新增好友数据的写法如下:
- 首先定义单条好友数据的校验函数
function isFriendDataValid(data) { // 先判断值是Map类型,再校验两个字段的类型 return data is map && data.displayName is string && data.color is number; }
- 拿到新增好友的键集合后,直接遍历键列表,逐次取Map中对应的值做校验即可,不需要额外批量取值
// 取已存在的旧好友列表,新建文档场景下旧列表为空 let oldFriendsList = resource == null ? {} : resource.data.friends; // 取请求提交的新好友列表 let newFriendsList = request.resource.data.friends; // 拿到本次新增的好友ID键集合 let addedFriendKeys = newFriendsList.diff(oldFriendsList).addedKeys(); // 校验所有新增好友的数据都符合规则 let addedFriendsValid = addedFriendKeys.every(friendId => isFriendDataValid(newFriendsList[friendId]));
- 最后把
addedFriendsValid作为规则允许写入的判断条件之一即可。
补充说明
如果你还需要校验本次修改的已有好友条目(非新增,是修改原有好友的信息),可以额外取changedKeys()做同样的遍历校验,逻辑完全一致:
let changedFriendKeys = newFriendsList.diff(oldFriendsList).changedKeys(); let changedFriendsValid = changedFriendKeys.every(friendId => isFriendDataValid(newFriendsList[friendId]));
内容的提问来源于stack exchange,提问作者RominHood
相关产品推荐
相关产品推荐

