import * as functions from 'firebase-functions'; console.log('I am a log entry0!'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); console.log('I am a log entry1!'); export const onMessageCreate = functions.database .ref('/users/{userId}/totalScore') .onUpdate((change) => { console.log('I am a log entry2!'); //var a = admin.firestore().collection('/users'); }) I have deployed the function and I can see it in the console. But the function is not executed when totalScore is updated in the database....
3 Réponses :
Je pense que la mise à jour est vérifiée sur la référence et non sur l'enfant Essayez ceci
export const onMessageCreate = functions.database .ref('/users/{userId}') .onUpdate((change) => { console.log('I am a log entry2!'); //var a = admin.firestore().collection('/users'); })
Vous obtenez l'ancienne et la nouvelle valeur de l'instantané à cet emplacement
toujours pas d'exécution bien que totalScore
ait changé: /
Votre base de données est Firestore mais vous utilisez une fonction cloud qui est déclenchée par une mise à jour dans la base de données en temps réel. Ce sont deux services Firebase différents et vous devez modifier votre code en conséquence.
Le code suivant fonctionnera:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.onMessageCreate = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { // Get an object representing the document const newValue = change.after.data(); // ...or the previous value before this update const previousValue = change.before.data(); if (newValue.totalScore !== previousValue.totalScore) { console.log('NEW TOTAL SCORE'); } return null; //I guess you are going to do more than just logging to the console. //If you do any asynchronous action, you should return the corresponding promise, see point 3 below //For example: //if (newValue.totalScore !== previousValue.totalScore) { // return db.collection("score").doc(newValue.name).set({score: newValue.totalScore}); //} });
Notez que:
onUpdate
lorsqu'un champ spécifique du document change. La fonction Cloud sera déclenchée lorsque n'importe quel champ du document Firestore change. Mais vous pouvez détecter quel (s) champ (s) ont changé, comme indiqué dans le code ci-dessus. admin.initializeApp ();
, voir https://firebase.google.com/docs/functions/beta-v1-diffList return null;
(Pour plus de détails sur ce point, je vous suggère de regarder les 3 vidéos sur "JavaScript Promises" de la série de vidéos Firebase: https://firebase.google.com/docs/functions/video-series/ ).
comment essayez-vous de le tirer? mettez-vous à jour un nœud totalScore
existant?
j'ai téléchargé une photo du nœud
D'accord maintenant je comprend! Votre base de données est Firestore mais vous utilisez une fonction cloud qui est déclenchée par une mise à jour dans la base de données en temps réel . Ce sont deux services Firebase différents. Je mettrai à jour ma réponse.
J'obtiens toujours une erreur: [ts] Le paramètre «change» a implicitement un type «any». [7006]
et [ts] 'context' est déclaré mais sa valeur n'est jamais lue. [6133] [ts] Le paramètre 'context' a implicitement un type 'any'. [7006]
Voir stackoverflow.com/questions/43064221/…
J'obtiens également [ts] Impossible de trouver le nom 'db'. [2304]
continuons cette discussion dans le chat .
Si vous utilisez Cloud Firestore, votre auditeur est incorrect. Dans votre cas, vous spécifiez un écouteur pour Realtime Database. Nous extrayons Firestore des fonctions et spécifions le chemin vers le document sur lequel nous voulons avoir un auditeur:
import * as functions from 'firebase-functions'; const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); export const onMessageCreate = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { console.log(change.before.data()); // shows the document before update console.log(change.after.data()); // shows the document after change return; })
Cette fonction cloud ne se déploiera probablement pas correctement en raison du chemin d'accès users / {userId} / {documentId}
.
Hé, tu as raison. :) Le {documentId} ne devrait pas être là. Je vais le modifier. J'ai vu votre réponse qui devrait résoudre le problème.
j'obtiens toujours une erreur: [ts] Le paramètre «change» a implicitement un type «any». [7006] et [ts] 'context' est déclaré mais sa valeur n'est jamais lue. [6133] [ts] Le paramètre 'context' a implicitement un type 'any'. [7006]
Voulez-vous dire que vous ne voyez pas le journal pour "Je suis une entrée de journal2!"?
Je ne vois aucune entrée de journal (sauf pour la première fois lorsque je déploie la fonction). Je ne vois aucun appel non plus dans la console Firebase