resources.data 和 request.resource.data 是同一件事吗?

use*_*921 3 firebase firebase-security

我看了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 &&
Run Code Online (Sandbox Code Playgroud)

据说这是为了防止用户发送无效的 1-5 星级餐厅评级。然而,根据我从模拟器中了解到的,这验证了已经存在的数据,而不是传入的数据。

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

Fra*_*len 5

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

因此(仅)如果您的写入操作没有进行任何更改,它们会完全相同。

来自数据验证文档:

resource变量引用所请求的文档,并且resource.data是存储在文档中的所有字段和值的映射。有关该resource变量的更多信息,请参阅参考文档

写入数据时,您可能希望将传入数据与现有数据进行比较。在这种情况下,如果您的规则集允许挂起写入,则该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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)