cómo acceder a un nodo hijo firebase nodejs

hola tengo datos como este en mi base de datos de base de fuego introduzca la descripción de la imagen aquí

Quiero acceder al nombre del remitente.

Aqui esta mi codigo

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 me da la clave 1-5 . Quiero acceder al valor, por ejemplo, que tiene el nombre de sender_name en 1-5 . No sé cómo puedo hacer eso. He hecho algo como esto

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

Pero tengo un error indefinido

Los elementos chat nodo de chat son las teclas 1-5 , 6-10 , etc., no elementos de chat, según la estructura de datos que muestra.

Firebase child_added event solo se dispara en niños directos.

Si desea escuchar nuevos elementos con el oyente child_added , puede:

  1. Escuche en cada chat/1-5 , chat/6-10 , etc., para niños adicionales, pero entiendo que esto no es muy conveniente

Ejemplo para escuchar siempre a 1-5 niños:

 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); }); 

Y una solución genérica si no sabes cuál es la primera clave pero sabes que comienza con ‘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); } 

Y aún más genérico, escuche todas las claves intermedias (si no sabe cuáles son):

 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) }); 

Tenga en cuenta que este código escucha todas las subclaves como 1-5 , etc. Entonces, si solo hay unas pocas, o unas pocas docenas, diría que está bien, pero no aconsejaría escalar esto por encima de unos pocos cientos.

Otra opción (recomendada):

  1. Cambie la estructura de los datos de manera que todos los elementos se escriban directamente como niños de chat directo. (Eliminar 1-5 , nivel 6-10 )

Como explica @Pandaiolo, los eventos child_added se child_added para los niños directos de la ubicación que escuchas. Para cada niño, le proporciona una instantánea de todos los datos de ese niño. Así que su parámetro de data contiene toda la información que está buscando. Solo necesitas pasar por encima de él, para profundizar un nivel en el JSON con:

 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()); }); }); 

Esto imprimirá todos los nombres del remitente.