【问题标题】:"Null value error" in firestore simulatorFirestore 模拟器中的“空值错误”
【发布时间】:2018-09-20 04:28:14
【问题描述】:

我正在尝试从官方 Firestore docs 复制一个示例。您需要知道的一切都在屏幕截图中。是错误还是我遗漏了什么?

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    问题是/cities/moscow没有实际文档

    【讨论】:

    • 这个答案是什么意思,你怎么知道那里没有文件?
    • @Jay,我知道那里没有文档,因为我没有创建文档。一旦我将名为“moscow”的文档添加到“cities”集合中,错误就会消失。相反,我收到一条消息,说明是否允许读取。这只是一个令人困惑且描述性不强的错误。谢谢你的回答!
    • 啊。我懂了。虽然该位置可能没有文档,但规则问题的更大图景是尝试读取的字段不存在于任何位置。我认为我的回答确定了问题并提供了解决方案。如果它有帮助,请接受它,以便它可以帮助其他人!
    【解决方案2】:

    多一点解释会使 manidos 的答案成为一个很好的答案。

    似乎resources 应该只用于涉及已写入数据的规则;例如deletereadupdate

    如果您想对“将要”写入的数据设置规则,请使用getAfter

    【讨论】:

    • 如果你在写,你可以通过request.resource访问你要写的数据
    【解决方案3】:

    问题是 - 正如 manidos 所指出的那样,文件 /cities/moscow 不存在,因此无法访问该文件。但是,指定规则的一种更简洁的方法是:

    allow read: if (resource == null) || (resource.data.visibility == 'public')
    

    它允许应用程序查询不存在的数据而不会因安全异常而崩溃。

    【讨论】:

      【解决方案4】:

      关键是通读cmets。

      许多应用程序将访问控制信息存储为文档中的字段 数据库。 Cloud Firestore 安全规则可以动态允许或 根据文档数据拒绝访问:

      然后

      // 如果文档的 'visibility' 字段设置为 'public',则允许用户读取数据

      如果您查看指南中提供的示例数据

      let citiesRef = db.collection("cities")
      citiesRef.document("SF").setData([
          "name": "San Francisco",
          "state": "CA",
          "country": "USA",
          "capital": false,
          "population": 860000,
          "regions": ["west_coast", "norcal"]
      ])
      

      没有“可见性”字段,但有名称、国家/地区字段等。

      如果您想使用该数据集,请为每个城市添加一个“可见性”字段并将其值设置为“公共”

       citiesRef.document("SF").setData([
              "name": "San Francisco",
              "visibility": "public"
      

      【讨论】:

        【解决方案5】:

        我还在学习,但有问题

        允许读取:如果 (resource == null) || (resource.data.visibility == 'public')

        当您对 /cities/{doc} 使用此类规则时。每当您搜索没有确切文档ID的文档时,我都可以看到resource == null;上述规则将显示 /cities/{doc} 的所有内容,私有和公共,因为资源始终 == null。

        据我所知,只要在可以返回 1 个或多个文档的匹配中,就必须使用 get(...) 语句直接访问文档的数据,所以

        get(/database/...).data.visibility == 'public'

        【讨论】:

          猜你喜欢
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          • 2021-08-25
          • 1970-01-01
          • 1970-01-01
          • 2021-03-11
          • 1970-01-01
          • 2019-10-19
          相关资源
          最近更新 更多