web-dev-qa-db-fra.com

Accéder à un document Firestore cloud dans une fonction cloud

Dans ma base de données Google Firebase Firstore, je voudrais recueillir des données agrégées telles que le nombre de documents d'une collection. Étant donné que Firestore ne fournit pas de requêtes agrégatives, j'essaie d'écrire une fonction cloud qui incrémentera un champ chaque fois qu'un document est ajouté à la base de données qui contiendra le nombre de documents d'une collection.

Le problème que j'ai est que je ne peux pas pour la vie de moi-même comprendre comment récupérer des documents de Firestore dans une fonction cloud en utilisant nodejs.

Voici ce que je fais:

Au sommet de mon index.js fichier Je configure le SDK d'administration et qu'avez-vous comme ceci:

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

Ensuite, pour ma fonction cloud, je fais ceci:

exports.createPost = functions.firestore
  .document('posts/{post_id}')
  .onCreate(event => {

    // Get the post object
    var post = event.data.data();

    var senderID = post["sender_id"]; // This is not null

    // Access to user's document and the main ledger document
    const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
    const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');

    return Promise.all([userDocRef, ledgerDocRef]).then(snapshot => {

        const user = snapshot[0].val();
        const ledger = snapshot[1].val();

        console.log("user => "+user); // Logs: user => null
        console.log("ledger => "+ledger); // Logs: ledger => null

        const userPostCount = user["user_name"];
        const globalPostCount = ledger["global_post_count"] + 1;

        const userUpdate = user.update({"post_count" : userPostCount});
        const ledgerUpdate = ledger.update({"global_post_count" : globalPostCount});

        return Promise.all([userUpdate, ledgerUpdate]);
    });
});

Je me retrouve avec l'erreur:

TypeError: Impossible de lire la propriété 'global_post_count' de null sur Promise.all.then.snapshot

Ce que je pense signifie que quelque chose ne va pas avec ma requête, mais je ne sais pas quoi. users et posts sont des collections de niveau racine.

Je reçois également un avertissement qui dit:

Compte de facturation non configuré. Le réseau externe n'est pas accessible et les quotas sont sévèrement limités.

D'après ce que j'ai lu en ligne, je ne pense pas que cela l'affecte, mais j'ai pensé que cela valait la peine d'être noté.

Veuillez aider.

9
Garret Kaye

Il semble que vous ayez écrit un déclencheur Firestore, mais que vous accédez ensuite à la base de données en temps réel pour les requêtes:

const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');

Si votre RTDB est vide, ces requêtes seront également vides.

Pour interroger Firestore, vous devez utiliser admin.firestore() au lieu de admin.database(). Firestore a une principalement une API différente (via le SDK Cloud que je viens de lier) que RTDB, mais ils sont similaires à certains égards.

15
Doug Stevenson