【问题标题】:How to retrieve data from Firebase Database?如何从 Firebase 数据库中检索数据?
【发布时间】:2016-11-27 05:20:08
【问题描述】:

我正在尝试创建一个简单的程序,该程序从用户那里获取姓名、手机号码和电子邮件地址,然后将数据放入 Firebase 实时数据库。

有3个输入框和一个按钮,点击即可完成上述操作。代码如下:

<input type="text" id="name">
<input type="text" id="mobile">
<input type="text" id="email">

<button type="button" id="button" onclick="addLead()">Submit</button>

我已经这样设置 Firebase:

<script src="https://www.gstatic.com/firebasejs/3.2.0/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    ...
  };
  firebase.initializeApp(config);

  var database = firebase.database();
</script>

这是我的addLead() 函数:

function addLead() {
    var clientName = document.getElementById('name').value;
    var clientMobile = document.getElementById('mobile').value;
    var clientEmail = document.getElementById('email').value;

    var newClientKey = database.ref().child('leads').push().key;
    database.ref('leads/'+newClientKey+'/name').set(clientName);
    database.ref('leads/'+newClientKey+'/mobile').set(clientMobile);
    database.ref('leads/'+newClientKey+'/email').set(clientEmail);
}

这就是我将数据放入数据库的方式。

所以newClientKey 正在生成一些字符串,插入时效果很好,但现在如何检索? official documentation 没有帮助。这个生成的字符串可能是基于时间戳的,如果是这种情况,那么再次生成它是不可能的。

在检索仅在插入时才可用的唯一生成字符串下,我将如何访问电子邮件、手机和姓名?

按照上述结构,我需要降低 2 个级别才能访问所需的数据,并且由于缺乏文档,我不知道该怎么做,我不确定这样的事情是否可行:

database.child().child();

【问题讨论】:

  • database.ref().child('leads').once('value').then(function(lead) { console.log(lead.val().email, lead.val().mobile, lead.val().name); }); 在控制台中产生了什么?
  • @Deryck 它产生“未定义”。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

这个问题的答案深藏在 Firebase Database Reference 中。 forEach() 用于在不知道孩子确切路径的情况下到达孩子。

var leadsRef = database.ref('leads');
leadsRef.on('value', function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      var childData = childSnapshot.val();
    });
});

现在childSnapshot 将包含所需的数据,同样的东西也可以使用child_added 访问。

leadsRef.on('child_added', function(snapshot) {
      //Do something with the data
});

唯一的区别是forEach()的情况下,它会从头开始循环,所以如果添加任何新数据,它也会加载以前的数据,但child_added的情况下,监听器只有新的孩子,而不是以前的现有孩子。

【讨论】:

  • 非常有用。谢谢。
  • 我真的希望这是在标准文档中。埋得很深!
  • firebaser here 在文档指南中有一个部分 listen for value events 也有一个示例。我很想知道人们在这里使用什么搜索词,所以我们也可以在文档中使用这些词。
  • @FrankvanPuffelen “我很想知道人们在这里使用什么搜索词”:firebase 检索数据 javascript
【解决方案2】:

您还可以使用点表示法来获取您正在寻找的孩子的价值。

下面我刚刚从评分最高的答案中注释掉了 forEach 循环,并添加了一个 console.log()。

 var leadsRef = database.ref('leads');
  leadsRef.on('value', function(snapshot) {
      // snapshot.forEach(function(childSnapshot) {
        var childData = snapshot.node_.children_.root_.value.value_;
        console.log("snapshot.node_.children_.root_.value.value_: ", snapshot.node_.children_.root_.value.value_)
      // });
  });

在发布此内容时,我使用的是 firebase 5.9.1

src="https://www.gstatic.com/firebasejs/5.9.1/firebase.js"

【讨论】:

    【解决方案3】:
    var reference = db.ref('/test/');
    reference.on('value', function(snapshot) {
    snapshot.forEach(function(userSnapshot){
    console.log(userSnapshot.val().url)
    document.getElementById('gmap').href = userSnapshot.val().location;
    document.getElementById('gimg2').src = userSnapshot.val().url;
    document.getElementById('name').innerHTML = userSnapshot.val().uid;
    

    我也面临同样的问题。我想从 firebase 实时数据库中读取数据并在网上打印出来。 我正在阅读的数据在测试文档中。 使用on() 函数对其进行快照。 Firebase 为您提供了一个 foreach 循环来迭代测试文档中的数据。 变量userSnapshot 在循环时读取值。变量 location,urluid 是测试文档中的键。

    document.getElementById('gmap').href
    document.getElementById('gimg2').src 
    document.getElementById('name').innerHTML
    

    是用于在网络上打印数据的 DOM 元素

    <a id="gmap" class="btn btn-success btn-sm float-right" type="button" 
     role="button">See location </a>
     <p id="name"></p>
     <img id="gimg2" class="img-fluid"/>
    

    我希望这对某人有所帮助。

    【讨论】:

    • 当我通过属性(例如 userSnapshot.val().location)获取字段的值时,它返回给我 UNDEFINED 值,你知道为什么吗?我已经检查了我的财产是否有正确的名称,并且确实如此,=(谢谢
    【解决方案4】:

    如果您想从发布密钥或客户端密钥中检索数据,最好使用单独的用户名 喜欢:-

    ("leads/"+ mobile + "name")
    ("leads/"+ mobile + "email")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多