Tengo productos que cada producto tiene hijos y cada niño tiene hijos y quiero cobrar la suma de cada producto 
mi código es:
var firebaseProductsCollection = database.ref().child('finalVerifoneProducts'); firebaseProductsCollection.on('value', function(products) { products.forEach(function(firebaseProductReference) { code = firebaseProductReference.key; products.forEach(function(firebaseProductReference) { var code = firebaseProductReference.key; var firebaseGetBarcodes = database.ref().child('finalVerifoneProducts').child(code); firebaseGetBarcodes.on('value', function(productsBarcodes) { productsBarcodes.forEach(function(firebaseProductReference2) { var product = firebaseProductReference2.val(); if (!productArray.includes(product.code)) { // we have new product console.log(product.code + " : " + totalSum); productArray.push(product.code); totalSum = product.sum; } else { totalSum = parseInt(totalSum) + parseInt(product.sum); } // close the elsePero la cantidad del primer producto siempre es 0 y el resto de productos sale mal
Cuando carga una ruta desde la base de datos, todos los datos de esa ruta ya están incluidos en la instantánea que obtiene. Por lo tanto, no es necesario cargar por separado los datos secundarios anidados.
Sabiendo eso, puede simplificar significativamente su código para:
const firebaseProductsCollection = database.ref().child('finalVerifoneProducts'); firebaseProductsCollection.on('value', function(products) { let totalSum = 0; // 👈 products.forEach(function(productSnapshot) { code = productSnapshot.key; productSnapshot.forEach(function(productChildSnapshot) { var product = productChildSnapshot.val(); totalSum += product.sum; }); }); console.log(totalSum); // 👈 });