如何访问子节点firebase nodejs

时间:2018-04-06 12:20:19

标签: node.js firebase firebase-realtime-database

你好我的firebase数据库中有这样的数据 enter image description here

我想访问发件人姓名。

这是我的代码

var ref = firebase.database().ref().child('chat');

ref.on("child_added", function(data, prevChildKey) {
   var newPlayer = data.val();
   var key = data.key;
   console.log(key);


});

data.key为我提供了密钥1-5。我想访问sender_name下的1-5值。我不知道怎么能这样做。我做过类似的事情

var newPlayer = data.val();
console.log(newPlayer[key]['sender_name'];

但是我得到了一个未定义的错误

2 个答案:

答案 0 :(得分:1)

根据您显示的数据结构,chat节点的子元素为1-56-10等密钥,不是聊天项。

Firebase child_added事件仅针对直接子项启动。

如果您希望使用child_added听众收听新项目,您可以:

  1. 聆听每个chat/1-5chat/6-10等添加的孩子,但我明白这不太方便
  2. 总是听取1-5孩子的示例:

    var ref = firebase.database().ref().child('chat/1-5');
    
    ref.on("child_added", function(data) {
       var item = data.val();
       console.log('New message', item['sender_name'], item.text);
    });
    

    如果您不知道第一个键是什么,但是您知道它以'1 - '开头,那么这是一个通用解决方案:

    var ref = firebase.database().ref().child('chat');
    var firstKey = null
    
    ref.on("child_added", function(data) {
       // If first key is what you are looking for 
       // and changed (or is null) update item listener
       if (data.key.startsWith('1-') && data.key !== firstKey) {
          // But first remove previous listener if present
          firstKey && ref.child(firstKey).off("child_added", checkItemsAdded)
          firstKey = data.key
          ref.child(firstKey).on("child_added", checkItemsAdded)
       }
    });
    
    function checkItemsAdded(data) {
       var item = data.val();
       console.log('New message', item['sender_name'], item.text);
    }
    

    更通用的,听取所有中间密钥(如果你不知道它们是什么):

    var ref = firebase.database().ref().child('chat');
    
    ref.on("child_added", function(data) {
       // function checkItemsAdded is the same as above
       ref.child(firstKey).on("child_added", checkItemsAdded)
    });
    

    请注意,此代码会侦听所有子键,例如1-5等。所以,如果只有几个,或几打,我会说它没问题,但我不会建议将这个扩展到几百以上。

    其他(推荐)选项:

    1. 以所有项目直接写为chat直接子项的方式更改数据结构。 (删除1-56-10级别)

答案 1 :(得分:0)

正如@Pandaiolo所解释的那样,child_added事件会触发您所听取的位置的直接孩子。对于每个孩子,它会为您提供该孩子下所有数据的快照。因此,您的data参数包含您要查找的所有信息。你只需要遍历它,通过以下方式深入了解JSON:

var ref = firebase.database().ref().child('chat');

ref.on("child_added", function(data, prevChildKey) {
  var newPlayer = data.val();
  console.log(data.key);
  data.forEach(function(child) {
    console.log(child.key, child.child("sender_name").val());
  });
});

这将打印所有发件人姓名。