0
votes

boucle à travers des documents dans une collection pour obtenir des champs

J'ai une collection appelée utilisateurs à Firebase Fireestore. Chaque document de l'utilisateur de la collection est un utilisateur enregistré dans l'application. Chaque document a un champ appelé Token_ids. Comment puis-je faire boucler tous les documents pour obtenir les valeurs dans le champ Token_ids. J'utilise des fonctions de cloud Firebase pour le faire. Voici l'extrait de code que j'ai essayé d'utiliser, mais cela n'a pas fonctionné:

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

  //fetch all token ids of users

  const tokenReference = admin.firestore().collection("users");

  const tokenSnapshot  = await tokenReference.get();

  tokenSnapshot.forEach((doc) =>{

    console.log("Token ids are:" + doc.data().token_id);


  });

  });


2 commentaires

Je ne vois pas le code complet que vous avez essayé.


Pourriez-vous élaborer quelle est votre définition de «ne fonctionne pas», quel est votre comportement attendu, quel est votre comportement actuel et comment exécutez-vous votre script?


3 Réponses :


1
votes

Étant donné que les opérations de Firestore sont asynchrones, vous devez idéalement envelopper votre code dans un bloc ASYNC-Await.

Par exemple: p> xxx pré>

de cette manière tout le Tokenids code> variable sera rempli avec un tableau de Tokenids code>. p>

Alternativement, vous pouvez également rendre tous les appels asynchrones en parallèle car ils sont indépendants de l'autre. promess.all code> ( Référence ) P>

async function fetchAllTTokenIds() {

  const tokenReference = admin.firestore().collection("users");
  
  const tokenSnapshot  = await tokenReference.get();

  const tokenIds = await Promise.all(tokenSnapShot.map(doc => {
    return doc.data()
      .then(data => (data.token_id)) 
  }))


4 commentaires

J'ai essayé la première réponse. Il a donné l'erreur suivante: inattendu attendre à l'intérieur d'une boucle


Cela semble être une erreur lint . Cependant, j'ai mis à jour ma réponse et supprimé l'attente de la boucle.


La deuxième solution a donné l'erreur suivante aux journaux de fonctions Cloud: TypeError: Tokensnapshot.Map n'est pas une fonction


Après la mise à jour, j'ai dirigé le code, mais cela a donné cette erreur TypeError: Tokensnapshot n'est pas démarré, dans les journaux du cloud Firestore.



0
votes

Comment l'extrait de code sera structuré dépend si vous utilisez l'administrateur Firebase Admin SDK, que ce soit comme un script couru sur votre machine locale ou un httpscalable code> appelé par une application cliente. Pour le premier cas, il est écrit comme ceci:

dans votre script file.js code>, après l'initialisation de l'application, écrivez le code suivant. P>

exports.test_f = async function() {
  try {

    const tokenReference = admin.firestore().collection("users");

    const tokenSnapshot  = await tokenReference.get();

    tokenSnapshot.forEach((doc) =>{

      console.log("Token ids are:" + doc.data().token_id);


    });
  } catch (error) {
    console.log(error);
  }
}

exports.test_f();


0 commentaires

1
votes

m'a pris un moment, mais j'ai finalement trouvé la solution à elle. C'est ici. C'est la première solution donnée par Dhruv Shah mais légèrement modifié: xxx


1 commentaires

Si vous avez trouvé la solution, veuillez envisager d'accepter votre propre réponse.