1

Donc j'utilise firebase comme backend pour une application de démonstration, et j'aime beaucoup la pile, mais je suis accroché sur un problème, je n'arrive pas à comprendre comment extraire les valeurs de la base de données (I 'ai des clés bien).
En termes simples, j'envoie des informations d'un périphérique qui contient le "nom convivial" d'un autre périphérique qu'il essaie d'atteindre à une fonction Firebase. Le code de fonction ressemble à ceci:Comment obtenir une valeur à partir de la base de données Firebase et l'affecter à une valeur dans Firebase Cloud Functions?

exports.connectMe = functions.https.onRequest((req, res) => { 
    cors(req, res,() => { 
    admin.database().ref('calls/' + req.body.id + '/').set({ 
     target: req.body.target, 
     caller: req.body.caller, 
     time: req.body.time 
    }); 

    const target = req.body.target; 
    console.log(`target: ${target}`); 
    const targetCall = admin.database().ref(`tokens/${target}/token`); 
    console.log(targetCall); 
    // const targetValue = targetCall.val(); 
    res.status(200).send("Thanks For The Call!"); 
    });  
}); 

La variable, targetCall est signalé à juste titre à l'entrée db que je veux atteindre, mais je ne peux pas extraire la valeur de la vie de moi. Le jeton situé au admin.database.ref doit être placé dans une requête http. Comment puis-je obtenir la valeur? Le code commenté montre la variable que je voudrais stocker, mais je sais que .val() n'est pas une méthode de référence.
Pour l'enregistrement, admin est défini sur require('firebase-admin'); précédemment dans le code.

Répondre

1

Vous êtes très proche de la requête de base de données pour fonctionner.

Jetez un coup d'œil au Firebase Documentation. Il explique comment accéder aux données structurées.

exports.connectMe = functions.https.onRequest((req, res) => { 
    cors(req, res,() => { 
     const callRef = admin.database().ref('calls/' + req.body.id + '/').set({ 
      target: req.body.target, 
      caller: req.body.caller, 
      time: req.body.time 
     }); 

     const target = req.body.target; 
     console.log(`target: ${target}`); 

     const takenRef = admin.database().ref(`tokens/${target}/token`) 
      .once('value'); 

     Promise.all([callRef, takenRef]) 
      .then(results => { 
       const snapshot = results[1]; // Promise of `takenRef` 
       console.log(snapshot.val()); // This is the data from the database... 

       res.status(200).send("Thanks For The Call!"); 
      }); 
    });  
}); 

voir le code mis à jour, j'ai ajouté .once('value').then(snapshot sur votre requête qui vous donne accès aux données.

+0

Cela a fonctionné comme je le voulais. Je n'ai pas compris que .once ('value') était destiné à plus que l'initialisation, merci d'avoir éclairci ça! –

+0

N'oubliez pas d'attendre les deux opérations asynchrones ici! Vous pourriez vous retrouver dans une situation de concurrence et obtenir des résultats incohérents. Promise.all (...) pour la victoire. – Kato

1

Vous devez appeler la fonction once(), que l'on trouve dans le documentation:

targetCall.once("value", function(data) { 
    const targetValue = data.val(); 
    res.status(200).send("Thanks For The Call!"); 
});