2

Dans ma base de données Google Firebase Firstore Je voudrais recueillir des données agrégatifs comme le nombre de documents a une collection. Puisque Firestore ne fournit pas de requêtes agrégatives, j'essaye d'écrire une fonction de nuage qui va incrémenter un champ chaque fois qu'un document est ajouté à la base de données qui contiendra le nombre de documents d'une collection.Accédez à un document FireStore nuage dans une fonction nuage

Le problème que je vais avoir est que je ne peux pas pour la vie de me comprendre comment saisir des documents à partir Firestore dans une fonction de nuage à l'aide nodejs.

Voici ce que je fais:

Au sommet de mon fichier index.js configurer le SDK d'administration et ce que vous avez comme ceci:

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

Alors pour ma fonction de nuage 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: Cannot read property 'global_post_count' of null at Promise.all.then.snapshot

Ce qui veut dire quelque chose je figure ne va pas avec ma requête, mais je ne sais pas quoi. Les users et posts sont des collections au niveau racine.

Im aussi obtenir un avertissement qui dit:

Billing account not configured. External network is not accessible and quotas are severely limited.

D'après ce que j'ai lu en ligne, je ne pense pas que les effets, mais je pensais qu'il était intéressant de noter.

Aidez-nous s'il vous plaît.

Répondre

6

On dirait que vous avez écrit un déclencheur Firestore, mais atteignez ensuite en temps réel la base de données 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 finiront également vide. Pour interroger Firestore, vous devez utiliser admin.firestore() au lieu de admin.database(). Firestore a un mostly different API (via le Cloud SDK que je viens de lier) que RTDB, mais ils sont similaires à certains égards.

+0

Ohhhh Je vois maintenant des thats assez lisse. Merci d'avoir répondu, je me suis cogné la tête contre le mur ces dernières heures. –