2
votes

Fonction Firebase non exécutée

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....

2 commentaires

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


3 Réponses :


1
votes

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


1 commentaires

toujours pas d'exécution bien que totalScore ait changé: /



4
votes

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:

  1. Vous ne pouvez pas déclencher la fonction cloud 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.
  2. Depuis la version 1.0, vous devez vous initialiser avec admin.initializeApp (); , voir https://firebase.google.com/docs/functions/beta-v1-diffList
  3. Vous devez indiquer à la plate-forme la fin de l'exécution de la fonction cloud: puisque vous n'exécutez aucune opération asynchrone dans votre fonction cloud, vous pouvez utiliser 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/ ).


7 commentaires

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 .



1
votes

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; 
})


3 commentaires

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]