Tengo una base de datos en tiempo real de Firebase que está estructurada así:
referrals Test1: 0 Test2: 0
Estoy tratando de verificar si existe "referral_code" en la base de datos, este es el código que estoy usando:
exports.validateReferral = functions.https.onCall((data, context) => { const referral_code = data.ref console.log("Cloud verifying referral code, code is " + referral_code) admin.database().ref().child("referrals").once("value", snapshot => { if (snapshot.hasChild(referral_code)) { console.log("referral code is valid"); return true } else { console.log("referral code is not valid"); return false } }) })
Cuando lo ejecuto, muestra "Código de referencia de verificación de la nube, el código es Test1", pero tampoco es válido a pesar de que la clave está en la base de datos.
¿Alguna idea de cómo puedo depurar esto? Intenté registrar el valor de "instantánea", pero ninguno de los contenidos de las instantáneas de Firebase muestra los valores reales. ¿Alguien puede ayudarme a encontrar la manera de localizar el problema?
Te estás perdiendo un return
en el nivel superior de tu código:
// 👇 return admin.database().ref().child("referrals").once("value").then((snapshot) => { if (snapshot.hasChild(referral_code)) { console.log("referral code is valid"); return true } else { console.log("referral code is not valid"); return false } })
Sin la devolución de nivel superior, el valor de devolución de la devolución de llamada asíncrona nunca llega a su cliente y (peor aún) el código probablemente finaliza antes de que el resultado se lea de la base de datos.
Pero también recomiendo cambiar el código para no descargar todo el nodo de referrals
solo para verificar si existe una clave. Esto logra lo mismo y solo descarga (como máximo) un solo nodo secundario:
// 👇 👇 return admin.database().ref().child("referrals").child(referral_code).once("value").then((snapshot) => { // 👇 if (snapshot.exists()) { console.log("referral code is valid"); return true } else { console.log("referral code is not valid"); return false } })