web-dev-qa-db-fra.com

Firestore + fonctions cloud: comment lire à partir d'un autre document

J'essaie d'écrire une fonction cloud de Google qui lit à partir d'un autre document. (Autre document = pas le document qui a déclenché la fonction cloud.)

C'est un peu une chasse au trésor pour comprendre comment faire une chose aussi simple.

  1. La documentation des fonctions cloud semble suggérer de regarder le SDK administrateur: "Vous pouvez apporter des modifications Cloud Firestore via l'interface DeltaDocumentSnapshot ou via le SDK Admin."

    https://firebase.google.com/docs/functions/firestore-events

  2. Le SDK Admin suggère d'écrire la ligne de code suivante pour obtenir un client. Mais oh non, ça ne va pas expliquer le client. Cela va nous envoyer à une chasse aux oies sauvages ailleurs dans la documentation.

    var defaultFirestore = admin.firestore();

    "Le client Firestore par défaut si aucune application n'est fournie ou le client Firestore associé à l'application fournie."

    https://firebase.google.com/docs/reference/admin/node/admin.firestore

  3. Ce lien se résout en une page de présentation générale sans aucun indice direct sur la détermination de la prochaine chose.

    https://cloud.google.com/nodejs/docs/reference/firestore/0.10.x/

  4. En creusant un gros morceau, il y a une classe prometteuse appelée FireStoreClient. Il a une méthode "getDocument" qui semble prometteuse. Le paramètre semble compliqué. Plutôt que de simplement passer le chemin dans la méthode, il semble vouloir un document/collection entier comme paramètre.

    https://cloud.google.com/nodejs/docs/reference/firestore/0.10.x/FirestoreClient#getDocument

    var formattedName = client.anyPathPath("[PROJECT]", "[DATABASE]", "[DOCUMENT]", "[ANY_PATH]"); client.getDocument({name: formattedName}).then(function(responses) { var response = responses[0]; // doThingsWith(response) })

Donc, j'essaie de combiner toutes ces informations dans une fonction cloud de Google qui lira à partir d'un autre document.

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

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.updateLikeCount4 = functions.firestore
    .document('likes/{likeId}').onWrite((event) => {
        return admin.firestore()
            .getDocument('ruleSets/1234')
            .then(function(responses) {
                 var response = responses[0];
                 console.log('Here is the other document: ' + response);
             })
    });

Cette approche échoue avec:

admin.firestore.getDocument is not a function

J'ai aussi essayé. admin.firestore.document, admin.firestore.doc, admin.firestore.collection et bien d'autres. Aucun d'eux ne semble être une fonction.

Tout ce que je veux, c'est lire un autre document Firestore dans ma fonction cloud de Google.

PS: Ils ont dit que la documentation était votre amie. Cette documentation est un cauchemar qui suit le principe de disperser tous les indices dans les quatre directions du vent!

10
Thomas Fischer

Merci, @ frank-van-puffelen.

Voici la solution de travail:

exports.updateLikeCount = functions.firestore
    .document('likes/{likeId}').onWrite((event) => {
        return admin.firestore()
            .collection('ruleSets')
            .doc(1234)
            .get()
            .then(doc => {
                console.log('Got rule: ' + doc.data().name);
            });
    });
10
Thomas Fischer