Trigger di Google Cloud Firestore (1ª generazione.)
Cloud Functions può gestire gli eventi in Cloud Firestore nello stesso progetto Google Cloud della funzione. Puoi leggere e/o aggiornare Cloud Firestore in risposta a questi eventi utilizzando le API e le librerie client di Firestore.
In un ciclo di vita tipico, una funzione Cloud Firestore esegue quanto segue:
Attende le modifiche a un determinato documento.
Si attiva quando si verifica un evento ed esegue le sue attività.
Riceve un oggetto dati con uno snapshot del documento interessato. Per gli eventi
write
oupdate
, l'oggetto dati contiene snapshot che rappresentano lo stato del documento prima e dopo l'evento di attivazione.
Tipi di evento
Cloud 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 un documento viene scritto per la prima volta. |
providers/cloud.firestore/eventTypes/document.update |
Si attiva quando un documento esiste già e presenta un valore modificato. |
providers/cloud.firestore/eventTypes/document.delete |
Si attiva quando un documento con dati viene eliminato. |
providers/cloud.firestore/eventTypes/document.write |
Si attiva quando un documento viene creato, aggiornato o eliminato. |
I caratteri jolly vengono scritti nei trigger utilizzando parentesi graffe, come segue:
"projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}"
Specificare il percorso del documento
Per attivare la funzione, specifica un percorso del documento da ascoltare. Le funzioni rispondono solo alle modifiche ai documenti e non possono monitorare campi o raccolte specifici. Di seguito sono riportati alcuni esempi di percorsi di documenti validi:
users/marie
: attivatore valido. Monitora un singolo documento,/users/marie
.users/{username}
: attivatore 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. Fa riferimento alla raccolta secondariaaddresses
, non a un documento.users/{username}/addresses/home
: attivatore valido. Monitora il documento relativo all'indirizzo di casa per tutti gli utenti.users/{username}/addresses/{addressId}
: attivatore valido. Monitora tutti i documenti degli indirizzi.
Utilizzo di caratteri jolly e parametri
Se non conosci il documento specifico da monitorare, utilizza un {wildcard}
anziché l'ID documento:
users/{username}
rimane in ascolto delle modifiche a tutti i documenti dell'utente.
In questo esempio, quando viene modificato un campo in qualsiasi documento in users
, viene corrispondente un carattere jolly chiamato {username}
.
Se un documento in users
ha raccolte secondarie e viene modificato un campo in una di queste raccolte secondarie, 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 sostituire con ID raccolta o documento espliciti.
Struttura evento
Questo trigger richiama la tua 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
. Consulta la documentazione di Value
per i riferimenti al tipo. Ciò è particolarmente utile se utilizzi un linguaggio
digitato (come Go) per scrivere le funzioni.
Esempio di codice
La funzione Cloud Function di esempio riportata di seguito stampa i campi di un evento Cloud Firestore di attivazione:
Node.js
Python
Go
Java
C#
Ruby
PHP
L'esempio riportato di seguito recupera il valore aggiunto dall'utente, converte la stringa in quella posizione in lettere maiuscole e sostituisce il valore con la stringa in maiuscolo:
Node.js
Python
Go
Java
C#
Ruby
PHP
esegui il deployment della funzione
Il seguente comando gcloud
esegue il deployment di una funzione che viene attivata
da eventi di scrittura nel documento /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}"
Argomento | Descrizione |
---|---|
FUNCTION_NAME |
Il nome registrato della Cloud Function di cui esegui 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 classe nel codice sorgente. Facoltativo, a meno che tu non abbia utilizzato FUNCTION_NAME per specificare nel codice sorgente la funzione da eseguire durante il deployment. In questo caso, devi utilizzare --entry-point per indicare il nome della funzione eseguibile.
|
--runtime RUNTIME |
Il nome del runtime che stai utilizzando. Per un elenco completo, consulta la documentazione di riferimento di gcloud .
|
--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 in cui la funzione rimane in ascolto.
Deve essere conforme al seguente formato:
"projects/YOUR_PROJECT_ID/databases/(default)/documents/PATH"
Il testo {pushId} è un parametro carattere jolly descritto sopra
nella sezione Specificare il percorso del documento.
|
Limitazioni
Tieni presente le seguenti limitazioni per i trigger Firestore per Cloud Functions:
- Cloud Functions (1ª generazione.) prepara un database "(predefinito)" esistente in modalità nativa Firestore. Non supporta i database denominati Firestore o la modalità Datastore. In questi casi, usa Cloud Functions (2ª generazione.) per configurare gli eventi.
- L'ordine non è garantito. Modifiche rapide possono attivare chiamate di funzione in un ordine inaspettato.
- Gli eventi vengono pubblicati almeno una volta, ma un singolo evento può generare più chiamate di funzione. Evita di dipendere dalla meccanica "exactly-once" e scrivi funzioni idempotenti.
- Firestore in modalità Datastore richiede Cloud Functions (2nd gen). Cloud Functions (1ª generazione.) non supporta la modalità Datastore.
- Un trigger è associato a un singolo database. Non puoi creare un trigger che corrisponde a più database.
- L'eliminazione di un database non elimina automaticamente alcun trigger per quel database. L'attivatore interrompe la pubblicazione degli eventi, ma continua a esistere finché non elimini l'attivatore.
- Se un evento corrispondente supera le dimensioni massime della richiesta, l'evento potrebbe non essere pubblicato in Cloud Functions (1ª generazione.).
- Gli eventi non consegnati 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 consegnare l'evento alla funzione Cloud Functions a causa del superamento del limite per la 1ª generazione..." con gravità
error
. Puoi trovare il nome della funzione sotto il campofunctionName
. Se il camporeceiveTimestamp
è ancora a un'ora da questo momento, puoi dedurre i contenuti effettivi dell'evento leggendo il documento in questione con uno snapshot prima e dopo il timestamp. - Per evitare questa frequenza, puoi:
- Esegui la migrazione e l'upgrade a Cloud Functions (2nd gen)
- Ridimensiona il documento
- Elimina le funzioni Cloud Functions in questione
- Puoi disattivare il logging utilizzando le esclusioni, ma tieni presente che gli eventi offensivi non verranno comunque recapitati.