【问题标题】:How can i get each user data for multiple user in every team that i got in firebase (node.js)我如何在firebase(node.js)中获得每个团队中多个用户的每个用户数据
【发布时间】:2021-09-27 21:01:58
【问题描述】:

我在 firebase 上获得了一个用 NODE.JS 编写的函数,它为我提供了所有团队的详细信息,登录用户被分配到:

exports.getTeams = (req, res) => {
let teams = [];
db
    .collection("teams")
    .where("members", "array-contains" , req.user.user_id)
    .get()
    .then((data) => {
        data.forEach((doc) => {
            teams.push({
                teamId: doc.id,
                createdAt: doc.data().createdAt,
                leadId: doc.data().leadId,
                members: doc.data().members,
                name: doc.data().name 
            });
        });
        return res.status(200).json(teams);
    })
    .catch(err => {
        res.status(500).json({error: err.code})
    })
}

'members' 是一个包含每个 userId 的数组 - 这些 id 是我们可以过滤的唯一 id。 在这种情况下:

[uETl8OOisUQLRtmCHoOdy1bsQvf1, QOfg07fDa1X63ao30fq3vqUSU5f2]

如何获取此数组中每个用户的详细信息,例如名字和姓氏、电子邮件等。 据我所知,我应该向用户返回一个承诺,但是如何将它们分别分配给正确的团队。

示例用户集合:

样本团队集合:

错误代码:

【问题讨论】:

  • 用户数据(名字和姓氏,电子邮件,...)存储在哪里?在专用的 Firestore 集合中?

标签: node.js firebase express google-cloud-firestore


【解决方案1】:

看起来你想要:

  1. 获取用户所属的所有团队。
  2. 这些团队的所有成员
exports.getTeams = async (req: any, res: any) => {
  // QuerySnapshot of documents which matched the condition
  const teamsSnap = await admin.firestore().collection("teams").where("members", "array-contains", req.user.user_id).get()
  // Array containing data about all teams
  const teams = teamsSnap.docs.map((team) => ({
    teamId: team.id,
    createdAt: team.data().createdAt,
    leadId: team.data().leadId,
    members: team.data().members,
    name: team.data().name
  }))
   
  // Getting all member IDs by running a lot on teams array above
  // and creating a single array of all memberIds
  let memberIds = []
  teams.forEach((team) => {
    team.forEach((member) => {
      if (!memberIds.includes(member)) memberIds.push(member)
    })
  })

  // Request members' documents
  const requests = memberIds.map(m => admin.firestore().collection("users").doc(m).get())

  // If IDs of document ID are not same as user's UID and
  // the UID is present in the document as a field 'userId',
  // then change your query to this:
  const requests = memberIds.map(m => admin.firestore().collection("users").where("userId", "==", m).get())
  // You also need to access `docs[0]` in the map method below.

  // Array of DocumentSnapshots
  const membersSnap = await Promise.all(requests)
  // Array of User documents
  const memberDocs = membersSnap.map((m) => m.data())

  //const memberDocs = membersSnap.map((m) => m.docs[0].data())

  /* Parse your data here */ 

  return res.status(200).json(teams);
}

我只是做了一个小假设,即所有成员文档都在集合“用户”中,但请确保您替换它。在你拥有所有memberDocs 之后,解析/过滤它们并将必要的数据返回给客户端。

此外,您可能希望从 memberIds 数组中删除重复项,就好像您在许多团队中有同一个成员一样,最终会多次获取他们的文档。

编辑:

我运行了上面的代码,得到了这个:

第一个未定义,因为我没有使用密钥 u0 记录。

【讨论】:

  • 正如您正确假设的那样 - 所有成员都在“用户”集合中,但是,数组返回 [undefined, undefined...] 而不是用户详细信息。你能解释一下,最后 3 个作业是如何工作的吗?
  • @Kubens95 我会在代码中添加更多的 cmets,同时你能告诉我哪些数组记录了 undefined 吗?
  • 最后一个返回[undefined, undefined...],前一个返回带有许多未定义值的doc.snapshot,第一个返回一个带有少量Promise的对象{ }
  • @Kubens95 只是为了确认一下,在用户集合中,文档的密钥与成员的 UID 相同,对吧?
  • 不,您需要在第一个分配中通过语句 .where("userId", "==", m) 而不是 doc(m) 来过滤它们。但是,当我完成后,我收到了未处理的承诺拒绝。
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
相关资源
最近更新 更多