J'ai essayé pendant des heures de mettre à jour le score des utilisateurs stocké dans le cloud firestore dans mon application à l'aide des fonctions du cloud, mais j'obtiens cette erreur et je ne parviens pas à résoudre ce problème.
voici mon code:
const auth = require('firebase/auth'); const functions = require('firebase-functions'); const nodemailer = require('nodemailer'); const FieldValue = require('firebase-admin').firestore.FieldValue; const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); const db = admin.firestore(); exports.addPoints = functions.firestore .document(`users/{user}`) .onCreate(async (snap, context) => { const invitingFriendId = snap.data().invitingFriendId; const invitingFriendRef = db.collection('users').doc(invitingFriendId); return invitingFriendRef.update("points", db.FieldValue.increment(50)); });
4 Réponses :
Il semble que vous essayez d'utiliser le SDK des fonctions pour interroger Cloud Firestore. Cela ne fonctionnera pas du tout. La fonction SDK est uniquement utilisée pour déclarer les déclencheurs de fonction. Vous devez utiliser le SDK Firebase Admin pour effectuer la requête lorsque la fonction se déclenche.
Exigez firebase-admin de la manière la plus simple:
admin.firestore.FieldValue.increment()
Ensuite, effectuez la requête avec:
admin.firestore().documet("...").update(...);
L'incrément FieldValue peut être référencé comme ceci:
const admin = require('firebase-admin');
J'obtiens cette erreur "db.collection (...). Le document n'est pas une fonction". J'ai mis à jour mon code dans la question
J'ai résolu le problème mais j'ai maintenant cette erreur "TypeError: Impossible de lire la propriété 'incrément' de undefined"
Pouvez-vous montrer les modifications que vous avez apportées pour obtenir cette nouvelle erreur? J'ai testé en utilisant ce tutoriel , et en répliquant cela fonctionne bien.
FYI faute de frappe mineure dans le 2ème bloc de code ci-dessus: «documet» doit être «document»
J'ai vu le même message d'erreur, puis j'ai réussi à le faire fonctionner avec Firebase Functions après avoir mis à jour Firebase Functions vers la dernière version.
npm install firebase-functions@latest firebase-admin@latest --save npm install -g firebase-tools
https://firebase.google.com/docs/functions/ get-started # set-up-node.js-and-the-firebase-cli
J'écris aussi pour CloudCode. Il est bon de comprendre que les variables firestore ne pointent pas nécessairement vers la même chose car ce ne sont que des noms.
A. Le firestore ici est utilisé pour accéder à la base de données Firestore et définir les données. Cependant, ce firestore ne contient pas la FieldValue:
// Cloud Functions and setup triggers. const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp() //const firestore, comes after initialize app const firestore = admin.firestore() const FieldValue = admin.firestore.FieldValue exports.createdLikesTrigger = functions.firestore .document(`likes/{uid}/posts-liked/{postId}`) .onCreate(async (snap, context) => { const uid = context.params.uid const postId = context.params.postId const likeDocument = snap.data() const date = likeDocument.when const authorUid = likeDocument.author try{ //increment post count const increment = FieldValue.increment(1); await firestore.collection('posts').doc(postId).update({likes: increment}) catch(e){ console.log("Error in incrementing likes: ", e) } })
B. Au lieu de cela, FieldValue est contenu, non pas dans admin.firestore () qui est le firestore ci-dessus, mais par l'objet firestore ici:
const FieldValue = require('firebase-admin').firestore.FieldValue
C. Ainsi, en complétant ce qui précède, vous pouvez maintenant utiliser les deux variables firestore différentes que nous avons, le code B pour obtenir la FieldValue et A pour la mise à jour de la base de données
// The Firebase Admin SDK const admin = require('firebase-admin') admin.initializeApp() //const firestore db, comes after initialize app const firestore = admin.firestore()
J'ai rencontré le même problème en essayant d'appeler decrement lors de la mise à jour d'un document dans une fonction Firebase. Ensuite, j'ai vu ces deux documents sur l'API
https://firebase.google.com/docs /reference/admin/node/admin.firestore.FieldValue
https://firebase.google.com/docs/reference /js/firebase.firestore.FieldValue
Contrairement à firebase.firestore.FieldValue, la version admin n'a pas de méthodes d'incrémentation / décrémentation. je ne sais pas pourquoi est-ce le cas. Donc, à la place, je lis d'abord la valeur en utilisant get (), puis je soustrais avec une mise à jour ().
Si vous obtenez une erreur, il est important d'en copier le texte dans la question afin que nous puissions tous voir ce qui ne va pas.