web-dev-qa-db-fra.com

Firebase HTTP Cloud Functions - Lire la base de données une fois

J'ai une fonction HTTP Firebase. La fonction doit lire une valeur dans une base de données Firebase en fonction du paramètre de requête et renvoyer un résultat basé sur ces données.

Le SDK Firebase JS dit de le faire en utilisant:

return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = snapshot.val().username;
  // ...
});

Cependant, les exemples de fonctions Cloud ont:

var functions = require('firebase-functions');

functions.database.ref('/');

Mais la référence DB n'a pas la méthode once, seulement onWrite ( https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder ). C'est évidemment pour les fonctions d'écriture DB, plutôt que pour les fonctions HTTP.

Existe-t-il une façon correcte de lire la base de données une fois dans une fonction HTTP? Puis-je utiliser le SDK Firebase normal ou existe-t-il une meilleure solution?

Merci.

14
SteveEdson

J'ai trouvé la solution en combinant la réponse ici sur la façon d'obtenir le paramètre et une réponse de Michael Blight à Comment exécuter la requête à l'intérieur de la fonction Cloud?

La réponse montre également ce qui est requis pour utiliser firebase-admin.

Ce qui suit fonctionne pour moi lorsque j'appelle my-project.firebaseapp.com/event/123/.

var functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.showEvent = functions.https.onRequest((req, res) => {
    const params = req.url.split("/");
    const eventId = params[2];
    return admin.database().ref('events/' + eventId).once('value', (snapshot) => {
        var event = snapshot.val();
        res.send(`
            <!doctype html>
            <html>
                <head>
                    <title>${event.name}</title>
                </head>
                <body>
                    <h1>Title ${event. name} in ${event.city}</h1>
                </body>
            </html>`
        );
     });
});
37
MGR Programming

Vous confondez deux parties:

  • le module firebase-functions, qui contient la logique de déclenchement basé sur les appels de base de données avec functions.database.ref('/path').onWrite().
  • le module firebase-admin, qui permet à votre fonction d'appeler la base de données.

Puisque vous avez une fonction HTTP, vous devez déclencher comme la documentation des fonctions HTTP montre :

exports.data = functions.https.onRequest((req, res) => {
  // ...
});

Ensuite, dans votre fonction, vous accédez à la base de données comme la documentation pour le SDK Admin montre :

return admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = snapshot.val().username;
  // ...
});

Donc au total:

exports.date = functions.https.onRequest((req, res) => {
  admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {
    var username = snapshot.val().username;
    res.status(200).send(username);
  });
});

Notez qu'il s'agit d'un schéma délicat. L'appel à la base de données se produit de manière asynchrone et peut prendre un certain temps. En attendant cela, la fonction HTTP peut expirer et être interrompue par le système Google Cloud Functions. Voir cette section de la documentation .

En règle générale, je recommanderais d'utiliser un SDK de base de données Firebase ou son API REST pour accéder à la base de données et ne pas compter sur une fonction HTTP comme middleware.

10