【问题标题】:Firebase specific node read and writeFirebase 特定节点读写
【发布时间】:2018-03-05 19:04:10
【问题描述】:

我在一个网站上实现了一个表单来创建 firebase 用户,并根据表单中的选定状态在 firebase 数据库中为用户添加一个节点。
例如,如果用户在表单中选择“夏威夷”然后创建帐户,则帐户信息将存储在 firebase db 中的“夏威夷/id”中。

// JSON structure
    {
      "Hawaii": {
        "place1Id": {
          //infos
        },
        "place2Id": {
          //infos
        }
      },
      "New York": {
        "place1Id": {
          //infos
        },
        "place2Id": {
          //infos
        }
      }
    }

我的问题是如何确保稍后当用户将信息添加到他的帐户时,使用之前创建帐户时提供的凭据,此信息将存储在正确的节点中(例如夏威夷)

我试图比较当前用户 id 和来自 States 节点的键,但我的数据库非常大(并且会变得更大),因此代码最多需要 10 秒才能确定数据库的哪个节点用户是。 并且每个页面都必须发生相同的过程,因此这不是好的解决方案。

var placesRef = firebase.database().ref();
    placesRef.once("value", function(snpashot) {
      if (snpashot.child("Hawaii").hasChild(user.uid)) {
        console.log("Place is in Hawaii");
        activiteRef = firebase.database().ref().child("Hawaii").child(user.uid);
      }});

你能帮我解决这个问题吗?

谢谢!

【问题讨论】:

  • 首先,您可能会发现 Firestore 更合适。无论如何,将地址存储在users > uid 的子节点中。这样,用户可以拥有多个地址,例如家庭和办公室。
  • 我已经尝试过做 users > uid 但使用 firebase。主要问题是我希望 iOS 应用程序用户只能看到他们附近的地方。我尝试使用 geofire 或下载所有数据库,然后只显示最近的地点,但我的数据库太大,以至于在应用程序上下载这些地点需要 10 多秒。使用 Firestore 会更快吗?
  • Geofire/Firebase 非常适合您的用例。我让它在这个应用程序上工作。单击地图图标并输入 San Francisco 以查看它是否有效。 getaa.org
  • 我有5万多条,你确定不会慢吗?
  • 阅读 geofire 文档?...

标签: javascript firebase firebase-realtime-database firebase-authentication


【解决方案1】:

如果您键入uid,则无需执行任何操作即可:

activityRef = firebase.database().ref().child("Hawaii").child(user.uid);

这是对您想要的节点的直接引用(如果我理解正确的话)。你可以读取数据:

activityRef.once('value').then(snap => console.log(snap.exists, snap.val());

如果用户从未在那里写过,那将是null,否则将包含数据。您还可以执行update() 等其他操作来更改此位置的数据。

不需要执行顶级查询来检查节点是否已经存在——你可以直接读取它。

【讨论】:

  • 也许我没有正确理解您的答案(这里不是英语母语),但我的主要问题是我有 50 个节点,每个州一个。所有用户都可以访问我开发的 CMS,并使用我为他们创建的帐户和他们所在州的节点中的数据。那么如何确保当有人登录时,他会从他的节点编辑数据(在相应的状态节点中)?我可以用你给我的最后一行代码来实现这个吗?
  • 您可能希望使用security rules 来确保用户只能写入自己的uid。您可能还想查看how to structure your data
  • 因此,如果我使用安全规则来确保用户只能在他们的 uid 上进行书写,我可以执行以下操作:activityRef = firebase.database.ref() 然后在不需要的情况下对 activityRef 执行 .once指定地点在哪个州?总结一下:firebase.database.ref() 上的 .once 将与 firebase.database.ref().child('stateOfThePlace/uid') 的工作方式相同,通过自动确定用户信息处于哪个状态(节点)?顺便谢谢你帮助我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多