资源数据和请求资源数据是一回事吗? [英] Is resource.data and request.resource.data the same thing?

查看:11
本文介绍了资源数据和请求资源数据是一回事吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看了Firebase的官方指南,得到的印象是request.resource.data指向正在编写的新数据。然而,当我在模拟器中测试时,无论我发送什么,request.resource.data都存在,并且总是等于resource.data。我看了文档,里面有点意思。

如果这些值应该相同,我如何解释指南中的此代码段

    allow create: if 
    request.resource.data.score is number &&
    request.resource.data.score >=1 &&
    request.resource.data.score <=5 &&

据说这是为了防止用户发送无效的餐厅1-5星级评级。但是,根据我对仿真器的理解,这将验证已存在的数据,而不是传入的数据。

链接到视频中的时刻: https://youtu.be/eW5MdE3ZcAw?t=628

推荐答案

在创建/更新/删除操作中request.resource指的是操作后(如果操作成功)将存在的文档,而resource指的是操作前存在的文档。

因此(仅)如果您的写入操作不做任何更改,它们是否完全相同。

来自data validation的文档:

resource变量指的是请求的文档,resource.data是文档中存储的所有字段和值的映射。有关resource变量的详细信息,请参阅reference documentation

在写入数据时,您可能希望将传入数据与现有数据进行比较。在这种情况下,如果您的规则集允许挂起写入,request.resource变量将包含文档的未来状态。对于只修改文档字段子集的更新操作,request.resource变量将包含操作后的挂起文档状态。您可以检查request.resource中的字段值以防止不需要的或不一致的数据更新:

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure all cities have a positive population and
    // the name is not changed
    match /cities/{city} {
      allow update: if request.resource.data.population > 0
                    && request.resource.data.name == resource.data.name;
    }
  }
}

这篇关于资源数据和请求资源数据是一回事吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆