Trigger di Google Cloud Firestore (1ª generazione.)
Le funzioni Cloud Run possono gestire gli eventi in Firestore nello stesso progetto Google Cloud della funzione. Puoi leggere o aggiornare Firestore in risposta a questi eventi utilizzando le API e le librerie client di Firestore.
In un ciclo di vita tipico, una funzione Firestore esegue le seguenti operazioni:
Attende le modifiche a un determinato documento.
Si attiva quando si verifica un evento ed esegue le relative attività.
Riceve un oggetto dati con uno snapshot del documento interessato. Per gli eventi
write
oupdate
, l'oggetto dati contiene istantanee che rappresentano lo stato del documento prima e dopo l'evento di attivazione.
Tipi di evento
Firestore supporta gli eventi create
, update
, delete
e write
. L'evento
write
include tutte le modifiche a un documento.
Tipo di evento | Trigger |
---|---|
providers/cloud.firestore/eventTypes/document.create (valore predefinito) |
Si attiva quando viene scritto per la prima volta in un documento. |
providers/cloud.firestore/eventTypes/document.update |
Viene attivato quando esiste già un documento e un valore è stato modificato. |
providers/cloud.firestore/eventTypes/document.delete |
Viene attivato quando viene eliminato un documento con dati. |
providers/cloud.firestore/eventTypes/document.write |
Viene attivato quando un documento viene creato, aggiornato o eliminato. |
I caratteri jolly vengono scritti negli attivatori utilizzando le parentesi graffe, come segue:
"projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}"
Specifica il percorso del documento
Per attivare la funzione, specifica un percorso del documento da monitorare. Le funzioni rispondono solo alle modifiche del documento e non possono monitorare campi o collezioni specifici. Di seguito sono riportati alcuni esempi di percorsi dei documenti validi:
users/marie
: trigger valido. Monitora un singolo documento,/users/marie
.users/{username}
: trigger valido. Monitora tutti i documenti dell'utente. I caratteri jolly vengono utilizzati per monitorare tutti i documenti della raccolta.users/{username}/addresses
: attivatore non valido. Si riferisce alla sottoraccoltaaddresses
, non a un documento.users/{username}/addresses/home
: trigger valido. Monitora il documento dell'indirizzo di casa per tutti gli utenti.users/{username}/addresses/{addressId}
: trigger valido. Monitora tutti i documenti relativi all'indirizzo.
Utilizzo di caratteri jolly e parametri
Se non conosci il documento specifico che vuoi monitorare, utilizza un {wildcard}
instead of the document ID:
users/{username}
rileva le modifiche a tutti i documenti degli utenti.
In questo esempio, quando un campo di qualsiasi documento in users
viene modificato, corrisponde a un carattere jolly chiamato {username}
.
Se un documento in users
ha
sottocollezioni e un
campo in uno dei documenti di queste sottocollezioni viene modificato, il carattere jolly {username}
non viene attivato.
Le corrispondenze con caratteri jolly vengono estratte dai percorsi dei documenti. Puoi definire tutti i caratteri jolly che vuoi per sostituire ID raccolta o documento espliciti.
Struttura dell'evento
Questo attivatore invoca la funzione con un evento simile a quello mostrato di seguito:
{ "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 } }
Ogni oggetto Document
contiene uno o più oggetti Value
. Per i riferimenti ai tipi, consulta la documentazione di Value
. Questa operazione è particolarmente utile se utilizzi un linguaggio a tipi
(come Go) per scrivere le funzioni.
Esempio di codice
La Cloud Function di esempio riportata di seguito stampa i campi di un evento Cloud Firestore di attivazione:
Node.js
Python
Vai
Java
C#
Ruby
PHP
L'esempio seguente recupera il valore aggiunto dall'utente, converte la stringa in quella posizione in maiuscolo e sostituisce il valore con la stringa in maiuscolo:
Node.js
Python
Vai
Java
C#
Ruby
PHP
Eseguire il deployment della funzione
Il seguente comando gcloud
esegue il deployment di una funzione attivata
da eventi di scrittura sul documento /messages/{pushId}
:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --entry-point ENTRY_POINT \ --runtime RUNTIME \ --set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID \ --trigger-event "providers/cloud.firestore/eventTypes/document.write" \ --trigger-resource "projects/YOUR_PROJECT_ID/databases/(default)/documents/messages/{pushId}"
Argomento | Descrizione |
---|---|
FUNCTION_NAME |
Il nome registrato della Cloud Function di cui stai eseguendo il deployment.
Può essere il nome di una funzione nel
codice sorgente o una stringa arbitraria. Se FUNCTION_NAME è una
stringa arbitraria, devi includere il
flag --entry-point .
|
--entry-point ENTRY_POINT |
Il nome di una funzione o di una classe nel codice sorgente. Facoltativo, a meno che
non abbia utilizzato FUNCTION_NAME
per specificare la
funzione nel codice sorgente da eseguire durante il deployment. In questo
caso, devi utilizzare --entry-point per fornire il nome della
funzione eseguibile.
|
--runtime RUNTIME |
Il nome del runtime in uso. Per un elenco completo, consulta il
riferimento gcloud .
|
--set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID |
L'identificatore univoco del progetto come variabile di ambiente di runtime. |
--trigger-event NAME |
Il tipo di evento che la funzione monitorerà (uno tra
write , create , update o
delete ).
|
--trigger-resource NAME |
Il percorso completo del database a cui la funzione sarà in ascolto.
Deve essere conforme al seguente formato:
"projects/YOUR_PROJECT_ID/databases/(default)/documents/PATH"
Il testo {pushId} è un parametro jolly descritto sopra
in Specificare il percorso del documento.
|
Limitazioni
Tieni presenti le seguenti limitazioni per gli trigger Firestore per le funzioni Cloud Run:
- Le funzioni Cloud Run (1ª generazione.) richiedono un database "(default)" esistente in modalità nativa di Firestore. Non supporta i database Firestore con nome o la modalità Datastore. Utilizza le funzioni Cloud Run (2ª generazione.) per configurare gli eventi in questi casi.
- L'ordine non è garantito. Le variazioni rapide possono attivare le chiamate di funzione in un ordine imprevisto.
- Gli eventi vengono inviati almeno una volta, ma un singolo evento può comportare più chiamate di funzione. Evita di fare affidamento su meccanismi di esecuzione esattamente una volta e scrivi funzioni idempotenti.
- Firestore in modalità Datastore richiede Cloud Run Functions (2ª generazione.). Le funzioni Cloud Run (1ª generazione.) non supportano la modalità Datastore.
- Un trigger è associato a un singolo database. Non puoi creare un attivatore che corrisponda a più database.
- L'eliminazione di un database non comporta l'eliminazione automatica degli attivatori per quel database. L'attivatore interrompe l'invio di eventi, ma continua a esistere finché non lo elimini.
- Se un evento con corrispondenza supera la dimensione massima della richiesta, l'evento potrebbe non essere inviato alle funzioni Cloud Run (1ª generazione.).
- Gli eventi non inviati a causa delle dimensioni della richiesta vengono registrati nei log della piattaforma e conteggiati ai fini dell'utilizzo dei log per il progetto.
- Puoi trovare questi log in Esplora log con il messaggio "Impossibile inviare l'evento alla funzione Cloud perché le dimensioni superano il limite per 1ª generazione." di gravità
error
. Puoi trovare il nome della funzione nel campofunctionName
. Se il camporeceiveTimestamp
è ancora entro un'ora da adesso, puoi dedurre i contenuti effettivi dell'evento leggendo il documento in questione con uno snapshot prima e dopo il timestamp. - Per evitare questa cadenza, puoi:
- Esegui la migrazione e l'upgrade a Cloud Run Functions (2ª generazione.)
- Riduci le dimensioni del documento
- Elimina le funzioni Cloud Run in questione
- Puoi disattivare il logging stesso utilizzando le esclusioni, ma tieni presente che gli eventi in violazione non verranno comunque inviati.