【问题标题】:Cannot fetch list of UIDs inside "users" collection in firebase using reactjs无法使用reactjs在firebase中的“用户”集合中获取UID列表
【发布时间】:2020-07-17 13:41:02
【问题描述】:
constructor(props) {
    super(props);
    this.state = {
      users:[]
    };
  }

//method to get the data from users collection
  async componentDidMount() {
      const db = firebase.firestore();
      db.collection("users")
      .get()
      .then(querySnapshot => {
          const data = querySnapshot.docs.map(doc => doc.data());
          console.log(data);
          this.setState({ users: data });
      })
      .catch( err =>{
          console.log(err);
      });
    }

这个函数返回一个空错误 我想打印用户 uid 列表

这里有用户收藏,里面有零售商收藏及其文档

【问题讨论】:

  • 您看到了什么错误,在哪里? console.log(data); 返回什么?可以加个console.log(querySnapshot );吗?
  • 我得到了一个长度为 0 的数组而不是文档...来自查询快照的数据被存储到数据变量中..所以它应该显示文档列表..我用过console.log(querySnapshot) 它还显示长度为 0 的数组

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

您必须在这里意识到的一件事是您的用户集合不包含任何文档。文档 ID 以斜体显示,表示此处没有文档。 ID 是可见的,因为每个文档下都有一个嵌套的子集合。它们在控制台中显示为这样,以便您可以单击并导航到嵌套的子集合,尽管缺少文档。

如果您想通过查询列出用户,则必须在 users 集合中实际创建文档。如果您没有任何信息,它们可以为空。 但您确实需要用户集合中的实际文档才能在查询中显示任何内容。

【讨论】:

  • 先生,我已修复它.. 现在我如何将用户的 UID 列出到表中..
【解决方案2】:

当前代码querySnapshot.docs.map(doc => doc.data()) 中的这一行获取每个文档的数据。但是您将 UID 保留在每个文档的 ID 中,因此您需要使用:

  const db = firebase.firestore();
  db.collection("users")
  .get()
  .then(querySnapshot => {
      const data = querySnapshot.docs.map(doc => doc.id);
      console.log(data);
      this.setState({ users: data });
  })
  .catch( err =>{
      console.log(err);
  });

更新:正如 Doug 在他的回答中指出的那样,如果没有实际的用户文档,您的 get() 调用将不会返回它。 我强烈建议创建用户文档,即使它只是一个空文档。

目前,获取 UID 的唯一方法是为所有用户加载所有 retailers,然后使用这些结果来获取父文档的 ID:

  const db = firebase.firestore();
  db.collectiongroup("retailers")
  .get()
  .then(querySnapshot => {
      querySnapshot.forEach((doc) => {
          console.log("retailed "+doc.id+" for user "+doc.ref.parent.parent.id);
      });
  })
  .catch( err =>{
      console.log(err);
  });

您必须对 UID 进行重复数据删除,但这会导致获取 UID。

但是您将以这种方式为所有用户加载所有零售商,因此如前所述,我强烈建议您存储一个小/空的用户文档。

【讨论】:

  • 我仍然得到一个长度为 0 的数组。我想打印零售商集合的所有 UID
  • 每个用户都有自己的retailers 收藏。您是要为特定用户(如果是,是哪一个)或所有用户显示零售商?
  • 我现在想列出用户.. 我想在不同的模块中显示各个用户的零售商
  • 啊,我现在明白了。正如 Doug 指出的那样,如果没有实际的用户文档,则读取该集合将不会产生任何结果。
  • 是的先生...我已经修复它..但仍然无法打印 UID..虽然用户的长度现在不是 0
【解决方案3】:

querySnapshot.docs 上的 data 方法现在获取数据以获取您需要添加的每个文档的 id 访问 id 属性,因为 UID 存储在 id 属性中

async componentDidMount() {
      const db = firebase.firestore();
      db.collection("users")
      .get()
      .then(querySnapshot => {
          const data = querySnapshot.docs.map(doc => doc.data().id);
          console.log(data);
          this.setState({ users: data });
      })
      .catch( err =>{
          console.log(err);
      });
    }

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2020-11-30
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多