【问题标题】:How to get data from cloud firestore如何从 Cloud Firestore 获取数据
【发布时间】:2020-03-17 23:12:56
【问题描述】:

我正试图弄清楚如何从我的云存储中读取数据。

我有一条数据库规则说:

// Demo projects
    match /project/{projectId} {
      allow read;
      allow write;
    } 

然后,我尝试使用react firestore hooks 来读取数据。

我有

import { useDocument } from 'react-firebase-hooks/firestore';
import { fsDB, firebase, settings } from "../../../../../firebase";



const Overview = props => {    
  const { state } = useStateMachine(updateAction);
  const [value, loading, error] = useDocument(
    firebase.firestore().doc('hooks/kN7ZOK5HRmDs5KhKTYSb'),
    {
      snapshotListenOptions: { includeMetadataChanges: true },
    }
  );
  return (
    <div>

        <Paragraph>
        <h2 style={{color: '#213159'}}>
        <p>
        {error && <strong>Error: {JSON.stringify(error)}</strong>}
        {loading && <span>Document: Loading...</span>}
        {value && <span>Document: {JSON.stringify(value.data())}</span>}
      </p>

这似乎有效,因为生成了一条错误消息:

错误:{"code":"permission-denied","name":"FirebaseError"}

我的项目表已将所有读取和写入权限设置为 true(而我正在弄清楚如何使其工作)。

谁能看到从 Cloud Firestore 读取数据还需要什么?

【问题讨论】:

  • 我不能 100% 确定,但您可能需要将这些规则更改为 allow read: if true; allow write: if true
  • 文档不需要 if 语句。另外,我已经能够使用我设置的方法写入数据库,所以 if 语句似乎没有必要

标签: reactjs firebase google-cloud-firestore react-hooks


【解决方案1】:

您的规则并不完整,但我假设您刚刚给我们提供了一段看起来更像这样的摘录:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
// Demo projects
    match /project/{projectId} {
      allow read;
      allow write;
    } 
  }
}

如果是这样,您正在查找与此规则不匹配的文档 hooks/kN7ZOK5HRmDs5KhKTYSb(不会匹配 hooks 下的任何内容),因此读取将被拒绝。

如果您需要允许读取 hooks/kN7ZOK5HRmDs5KhKTYSb,您的规则可能希望如下所示:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /hooks/{hookId} {
      allow read;
      allow write;
    } 
  }
}

您应该能够use the simulator 快速验证规则,看看它们是否符合您的预期。将您要测试读取的文档放在模拟器的“位置”字段中。

模拟器还可以帮助您找到允许或拒绝请求的特定行,但它在您当前的情况下并没有真正的帮助,因为根本没有任何规则与 hooks/... 路径匹配,所以没有行将匹配。

【讨论】:

  • react-firestore-hooks 文档中的示例显示了这种模式。我不知道我是否应该通过钩子或其他方式进行映射。此时,我不在乎是否停止尝试找出 react-firestore-hooks,但我也找不到从模拟器中获取文档路径的方法。
  • 问题是你传递了一个你的规则拒绝的引用。我在 firestore hooks 文档中没有看到任何说明您必须使用该引用的内容,但我承认我并没有那么努力(即使确实如此,您仍然可以在规则中启用它。我已经在答案中添加了此类示例规则)。模拟器应该有一个非常明显的框来放置您要测试的文档参考。
  • 我已经测试了文档编号 - 但它并不能帮助我弄清楚如何在反应的钩子中使用该引用。还是谢谢。
  • 如果将规则更改为我发布的内容仍然显示权限被拒绝错误,请使用您的完整安全规则集更新您的原始帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 2020-03-19
  • 2022-06-24
相关资源
最近更新 更多