Déclencheurs Google Cloud Firestore (1re génération)
Cloud Functions peut gérer les événements dans Cloud Firestore dans le même projet Google Cloud contenant la fonction. Vous pouvez lire et/ou mettre à jour Cloud Firestore en réponse à ces événements à l'aide des API Firestore et des bibliothèques clientes.
Dans un cycle de vie typique, une fonction Cloud Firestore effectue les opérations suivantes :
Attend les modifications apportées à un document donné.
Se déclenche lorsqu'un événement se produit et exécute ses tâches.
Reçoit un objet de données contenant un instantané du document affecté. Pour les événements
write
ouupdate
, l'objet de données contient des instantanés représentant l'état du document avant et après l'événement déclencheur.
Types d'événement
Cloud Firestore accepte les événements create
, update
, delete
et write
. L'événement write
englobe toutes les modifications apportées à un document.
Type d'événement | Déclencheur |
---|---|
providers/cloud.firestore/eventTypes/document.create (par défaut) |
Déclenché lorsqu'un document est écrit pour la première fois. |
providers/cloud.firestore/eventTypes/document.update |
Déclenché lorsqu'un document existe déjà et qu'une valeur y a été modifiée. |
providers/cloud.firestore/eventTypes/document.delete |
Déclenché lorsqu'un document contenant des données est supprimé. |
providers/cloud.firestore/eventTypes/document.write |
Déclenché lorsqu'un document est créé, mis à jour ou supprimé. |
Les caractères génériques sont écrits dans les déclencheurs à l'aide d'accolades, comme suit : "projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}"
Spécifier le chemin d'accès du document
Pour déclencher votre fonction, spécifiez un chemin d'accès de document à écouter. Les fonctions ne réagissent qu'aux modifications de document et ne peuvent pas surveiller des champs ou des collections spécifiques. Voici quelques exemples de chemins d'accès de document valides :
users/marie
: déclencheur valide. Surveille un seul document,/users/marie
.users/{username}
: déclencheur valide. Surveille tous les documents d'utilisateur. Les caractères génériques permettent de surveiller tous les documents de la collection.users/{username}/addresses
: déclencheur non valide. Renvoie à la sous-collectionaddresses
, et non à un document.users/{username}/addresses/home
: déclencheur valide. Surveille le document d'adresses personnelles de tous les utilisateurs.users/{username}/addresses/{addressId}
: déclencheur valide. Surveille tous les documents d'adresses.
Utiliser des caractères génériques et des paramètres
Si vous ne connaissez pas le nom du document que vous souhaitez surveiller, utilisez un caractère générique ({wildcard}
) à la place de l'ID du document :
users/{username}
: écoute les modifications apportées à tous les documents d'utilisateur.
Dans cet exemple, lorsqu'un champ de n'importe quel document de la collection users
est modifié, il correspond au caractère générique {username}
.
Si un document de la collection users
comporte des sous-collections et qu'un champ de l'une d'entre elles est modifié, le caractère générique {username}
n'est pas déclenché.
Les correspondances de caractères génériques sont extraites du chemin du document. Vous pouvez définir autant de caractères génériques que vous le souhaitez pour remplacer les ID explicites de collection ou de document.
Structure de l'événement
Ce déclencheur appelle votre fonction avec un événement semblable à celui présenté ci-dessous :
{ "oldValue": { // Update and Delete operations only A Document object containing a pre-operation document snapshot }, "updateMask": { // Update operations only A DocumentMask object that lists changed fields. }, "value": { // A Document object containing a post-operation document snapshot } }
Chaque objet Document
contient un ou plusieurs objets Value
. Consultez la documentation de référence Value
pour obtenir plus d'informations sur les types de valeurs. C'est particulièrement utile si vous utilisez un langage saisi, tel que Go, pour écrire vos fonctions.
Exemple de code
L'exemple de fonction Cloud ci-dessous imprime les champs d'un événement déclencheur Cloud Firestore :
Node.js
Python
Go
Java
C#
Ruby
PHP
L'exemple ci-dessous récupère la valeur ajoutée par l'utilisateur, convertit la chaîne à cet emplacement en majuscules, et remplace la valeur par la chaîne en majuscules :
Node.js
Python
Go
Java
C#
Ruby
PHP
Déployer votre fonction
La commande gcloud
suivante déploie une fonction qui est déclenchée par des événements d'écriture sur le document /messages/{pushId}
:
gcloud functions deploy FUNCTION_NAME \ --entry-point ENTRY_POINT \ --runtime RUNTIME \ --trigger-event "providers/cloud.firestore/eventTypes/document.write" \ --trigger-resource "projects/YOUR_PROJECT_ID/databases/(default)/documents/messages/{pushId}"
Argument | Description |
---|---|
FUNCTION_NAME |
Nom enregistré de la fonction Cloud que vous déployez.
Il peut s'agir du nom d'une fonction dans votre code source ou d'une chaîne arbitraire. Si FUNCTION_NAME est une chaîne arbitraire, vous devez alors inclure l'option --entry-point .
|
--entry-point ENTRY_POINT |
Nom d'une fonction ou d'une classe dans votre code source. Ce paramètre est facultatif, sauf si vous n'avez pas utilisé FUNCTION_NAME pour spécifier quelle fonction de votre code source exécuter lors du déploiement. Dans ce cas, vous devez utiliser --entry-point pour fournir le nom de la fonction exécutable.
|
--runtime RUNTIME |
Nom de l'environnement d'exécution que vous utilisez. Pour obtenir la liste complète, consultez la documentation de référence sur gcloud .
|
--trigger-event NAME |
Type d'événement surveillé par la fonction (write , create , update ou delete ). |
--trigger-resource NAME |
Chemin d'accès complet de la base de données sur lequel la fonction écoutera.
Il doit être conforme au format suivant : "projects/YOUR_PROJECT_ID/databases/(default)/documents/PATH" . Le texte {pushId} est un paramètre de caractère générique décrit ci-dessus à la section Spécifier le chemin d'accès du document.
|
Limites
Notez les limitations suivantes concernant les déclencheurs Firestore pour Cloud Functions :
- Cloud Functions (1re génération) nécessite une base de données "(default)" existante en mode natif Firestore. La solution n'est pas compatible avec les bases de données nommées Firestore ni avec le mode Datastore. Veuillez utiliser Cloud Functions (2e génération) pour configurer des événements dans ce cas.
- L'ordre n'est pas garanti. Les modifications rapides peuvent déclencher des appels de fonctions dans un ordre inattendu.
- Bien que les événements soient diffusés une fois au moins, un même événement peut produire plusieurs appels de fonction. Évitez de dépendre de procédés dits "exactement une fois" et écrivez des fonctions idempotentes.
- Firestore en mode Datastore nécessite Cloud Functions (2e génération). Cloud Functions (1re génération) n'est pas compatible avec le mode Datastore.
- Un déclencheur est associé à une seule base de données. Vous ne pouvez pas créer un déclencheur qui correspond à plusieurs bases de données.
- La suppression d'une base de données ne supprime pas automatiquement les déclencheurs de cette base de données. Le déclencheur cesse de diffuser des événements, mais continue d'exister jusqu'à ce que vous le supprimiez.
- Si un événement correspondant dépasse la taille maximale de requête, il risque de ne pas être distribué à Cloud Functions (1re génération).
- Les événements non distribués en raison de la taille de la requête sont consignés dans les journaux de plate-forme et sont comptabilisés dans l'utilisation des journaux du projet.
- Vous trouverez ces journaux dans l'explorateur de journaux avec le message "Event cannot deliver to Cloud function due to size exceeding the limit for 1st gen..." (l'événement ne peut pas être distribué à la fonction Cloud, car sa taille dépasse la limite pour la 1re génération...) de gravité
error
. Vous trouverez le nom de la fonction dans le champfunctionName
. Si le champreceiveTimestamp
date de moins d'une heure, vous pouvez déduire le contenu réel de l'événement en lisant le document en question avec un instantané avant et après le code temporel. - Pour éviter une telle cadence, vous pouvez :
- Migrer et passer à Cloud Functions (2e génération)
- Réduire la taille du document
- Supprimer les fonctions Cloud Functions en question
- Vous pouvez désactiver la journalisation proprement dite à l'aide d'exclusions, mais notez que les événements mis en cause ne seront toujours pas distribués.