Attivatori di Firebase Realtime Database
Con le funzioni Cloud Run, puoi gestire gli eventi in Firebase Realtime Database nello stesso Google Cloud progetto della funzione. Le funzioni Cloud Run consentono di eseguire operazioni di database con privilegi amministrativi completi e garantiscono che ogni modifica al database venga elaborata singolarmente. Puoi apportare modifiche a Firebase Realtime Database tramite l'SDK Firebase Admin.
In un ciclo di vita tipico, una funzione Firebase Realtime Database esegue le seguenti operazioni:
Attende le modifiche a una posizione specifica del database.
Si attiva quando si verifica un evento ed esegue le attività.
Riceve un oggetto dati che contiene un'istantanea dei dati archiviati nel documento specificato.
Tipi di evento
Functions ti consente di gestire gli eventi del database a due livelli di specificità. Puoi ascoltare in modo specifico solo gli eventi di creazione, aggiornamento o eliminazione oppure ascoltare qualsiasi tipo di modifica a un percorso. Le funzioni Cloud Run supportano i seguenti tipi di eventi per Realtime Database:
Tipo di evento | Trigger |
---|---|
providers/google.firebase.database/eventTypes/ref.write |
Attivato in caso di qualsiasi evento di mutazione: quando i dati vengono creati, aggiornati o eliminati in Realtime Database. |
providers/google.firebase.database/eventTypes/ref.create (valore predefinito) |
Attivato quando vengono creati nuovi dati in Realtime Database. |
providers/google.firebase.database/eventTypes/ref.update |
Attivato quando i dati vengono aggiornati in Realtime Database. |
providers/google.firebase.database/eventTypes/ref.delete |
Attivato quando i dati vengono eliminati da Realtime Database. |
Specificare il percorso e l'istanza del database
Per controllare quando e dove deve essere attivata la funzione, devi specificare un percorso e, facoltativamente, un'istanza di database.
Percorso
Le specifiche del percorso corrispondono a tutte le scritture che interessano un percorso, incluse quelle che
si verificano in qualsiasi punto sottostante. Se imposti il percorso della funzione come /foo/bar
,
corrisponde agli eventi in entrambe le seguenti posizioni:
/foo/bar
/foo/bar/baz/really/deep/path
In entrambi i casi, Firebase interpreta che l'evento si verifica alle ore /foo/bar
e i dati
dell'evento includono i dati vecchi e nuovi alle ore /foo/bar
. Se i dati evento potrebbero
essere di grandi dimensioni, valuta la possibilità di utilizzare più funzioni in percorsi più profondi anziché una singola
funzione vicino alla radice del database. Per ottenere le prestazioni migliori, richiedi
i dati al livello più profondo possibile.
Puoi specificare un componente del percorso come carattere jolly racchiudendolo tra parentesi graffe; foo/{bar}
corrisponde a qualsiasi elemento secondario di /foo
. I valori di questi componenti del percorso
con caratteri jolly sono disponibili nell'oggetto event.params
della tua funzione.
In questo esempio, il valore è disponibile come event.params.bar
.
I percorsi con caratteri jolly possono corrispondere a più eventi di una singola scrittura. Un inserto di:
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
corrisponde due volte al percorso /foo/{bar}
: una volta con "hello": "world"
e una volta con
"firebase": "functions"
.
Istanza
Quando utilizzi la console Google Cloud , devi specificare l'istanza del database.
Quando utilizzi Google Cloud CLI, l'istanza deve essere specificata come
parte della stringa --trigger-resource
.
Ad esempio, il seguente codice utilizzerebbe quanto segue nella stringa --trigger-resource
:
--trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/PATH
Struttura dell'evento
Quando gestisci un evento Realtime Database, l'oggetto data
contiene due proprietà fornite in formato oggetto JSON:
data
: uno snapshot dei dati acquisiti prima dell'evento che ha attivato la funzione.delta
: uno snapshot dei dati acquisiti dopo l'evento che ha attivato la funzione.
Esempio di codice
Node.js
Python
Go
Java
C#
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Firebase.Database.V1; using Microsoft.Extensions.Logging; using System.Threading; using System.Threading.Tasks; namespace FirebaseRtdb; public class Function : ICloudEventFunction<ReferenceEventData> { private readonly ILogger _logger; public Function(ILogger<Function> logger) => _logger = logger; public Task HandleAsync(CloudEvent cloudEvent, ReferenceEventData data, CancellationToken cancellationToken) { _logger.LogInformation("Function triggered by change to {subject}", cloudEvent.Subject); _logger.LogInformation("Delta: {delta}", data.Delta); // In this example, we don't need to perform any asynchronous operations, so the // method doesn't need to be declared async. return Task.CompletedTask; } }
Ruby
PHP
use Google\CloudFunctions\CloudEvent; function firebaseRTDB(CloudEvent $cloudevent) { $log = fopen(getenv('LOGGER_OUTPUT') ?: 'php://stderr', 'wb'); fwrite($log, 'Event: ' . $cloudevent->getId() . PHP_EOL); $data = $cloudevent->getData(); $resource = $data['resource'] ?? '<null>'; fwrite($log, 'Function triggered by change to: ' . $resource . PHP_EOL); $isAdmin = isset($data['auth']['admin']) && $data['auth']['admin'] == true; fwrite($log, 'Admin?: ' . var_export($isAdmin, true) . PHP_EOL); fwrite($log, 'Delta: ' . json_encode($data['delta'] ?? '') . PHP_EOL); }
Deployment della funzione
Il seguente comando gcloud esegue il deployment di una funzione che verrà attivata dagli eventi
create
nel percorso /messages/{pushId}/original
:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --entry-point ENTRY_POINT \ --trigger-event providers/google.firebase.database/eventTypes/ref.create \ --trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/messages/{pushId}/original \ --runtime RUNTIME
Argomento | Descrizione |
---|---|
FUNCTION_NAME |
Il nome registrato della funzione Cloud Run di cui stai eseguendo il deployment.
Può essere il nome di una funzione nel tuo
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 hai 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.
|
--trigger-event NAME |
Il nome del tipo di evento che la funzione vuole ricevere. In questo caso, sarà uno dei seguenti: scrittura, creazione, aggiornamento o eliminazione. |
--trigger-resource NAME |
Il percorso completo del database che la funzione ascolterà.
Deve essere conforme al seguente formato:
projects/_/instances/DATABASE_INSTANCE/refs/PATH .
|
--runtime RUNTIME |
Il nome del runtime che stai utilizzando. Per un elenco completo, consulta il
riferimento gcloud .
|