resource.data与request.resource.data是否相同?Firebase安全规则相关疑问
Firebase安全规则
request.resource.data与resource.data差异说明 两个核心变量的明确定义
resource.data:指向数据库中当前已存在的对应文档的原始数据,仅在操作已存在的文档(更新、删除)时可用,文档创建(create)操作中该变量不存在。request.resource.data:指向本次请求最终要写入文档的完整数据,创建、更新操作均可用:如果是创建操作,值为用户提交的全部新数据;如果是更新操作,值为原有文档数据与用户提交的更新字段合并后的完整新数据。
测试异常原因说明
你在模拟器中观测到两者始终相等,基本是测试操作不规范导致的,常见错误场景有两种:
- 测试时误选了已存在的文档路径执行更新操作,且提交的更新内容和原有文档数据完全一致,才会出现两个变量值相同的情况。
- 测试创建规则时,实际选择的是已经预置了模拟数据的文档路径,触发的是更新规则而非创建规则。
官方代码逻辑解释
你提到的官方代码是作用于allow create规则下的,而创建操作中resource.data本身不存在,完全不可能校验已有数据:
allow create: if request.resource.data.score is number && request.resource.data.score >=1 && request.resource.data.score <=5
这段规则就是校验用户本次提交要写入的score字段必须是1到5之间的数字,完全符合限制餐厅评分范围的需求。
逻辑验证方法
你可以按以下操作复现正确逻辑:
- 选择一条不存在的文档路径测试创建操作,提交
score为6的写入请求,会触发规则拦截,即可确认校验的是新提交的数据。 - 针对已有文档测试更新操作,提交和原有
score值不同的写入请求,可观测到request.resource.data.score与resource.data.score值存在差异。
内容的提问来源于stack exchange,提问作者user10773921
相关产品推荐
相关产品推荐

