Firestore-Trigger (2. Generation)
Sie können Ihre Cloud Functions-Funktionen so konfigurieren, dass sie durch Ereignisse in einer Firestore-Datenbank ausgelöst werden. Nach der Auslösung kann Ihre Funktion Als Reaktion auf diese Ereignisse eine Firestore-Datenbank lesen und aktualisieren und zwar durch die Firestore APIs und client-Bibliotheken.
Der typische Lebenszyklus einer Cloud Firestore-Funktion sieht so aus:
Sie wartet auf Änderungen an einem bestimmten Dokument.
Sie wird ausgelöst, wenn ein Ereignis eintritt, und führt dessen Aufgaben aus.
Sie empfängt ein Datenobjekt mit einem Snapshot des betreffenden Dokuments. Für
write
- oderupdate
-Ereignisse enthält das Datenobjekt Snapshots, die den Dokumentstatus vor und nach dem auslösenden Ereignis darstellen.
Ereignistypen
Firestore unterstützt Ereignisse vom Typ create
, update
, delete
und write
. Das write
-Ereignis umfasst alle Änderungen eines Dokuments.
Ereignistyp | Trigger |
---|---|
google.cloud.firestore.document.v1.created (Standard) |
Wird ausgelöst, wenn ein Dokument zum ersten Mal beschrieben wird. |
google.cloud.firestore.document.v1.updated |
Wird ausgelöst, wenn ein Dokument bereits existiert und sich ein Wert geändert hat. |
google.cloud.firestore.document.v1.deleted |
Wird ausgelöst, wenn ein Dokument mit Daten gelöscht wird. |
google.cloud.firestore.document.v1.written |
Wird ausgelöst, wenn ein Dokument erstellt, aktualisiert oder gelöscht wird. |
Platzhalter werden in Triggern in geschweiften Klammern dargestellt: "projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}"
.
Dokumentpfad angeben
Wenn Sie eine Funktion auslösen möchten, müssen Sie den Dokumentpfad angeben, der überwacht werden soll. Der Dokumentpfad muss sich im selben Google Cloud-Projekt wie die Funktion befinden.
Hier sehen Sie ein paar Beispiele gültiger Dokumentpfade:
users/marie
: Gültiger Trigger. Überwacht ein einzelnes Dokument,/users/marie
.users/{username}
: Gültiger Trigger. Überwacht alle Nutzerdokumente. Bei Angabe von Platzhaltern werden alle Dokumente in der Sammlung überwacht.users/{username}/addresses
: Ungültiger Trigger. Bezieht sich auf die untergeordnete Sammlungaddresses
und nicht auf ein Dokument.users/{username}/addresses/home
: Gültiger Trigger. Überwacht das Privatadressdokument für alle Nutzer.users/{username}/addresses/{addressId}
: Gültiger Trigger. Überwacht alle Adressdokumente.users/{user=**}
: Gültiger Trigger. Überwacht alle Nutzerdokumente und alle Dokumente in untergeordneten Sammlungen unter jedem Nutzerdokument, z. B./users/userID/address/home
oder/users/userID/phone/work
.
Platzhalter und Parameter
Wenn Sie das Dokument, das überwacht werden soll, nicht kennen, verwenden Sie {wildcard}
anstelle der Dokument-ID:
users/{username}
wartet auf Änderungen für alle Nutzerdokumente.
Wenn in diesem Beispiel ein Feld in einem Dokument im Verzeichnis users
geändert wird, entspricht es einem Platzhalter namens {username}
.
Wenn ein Dokument in users
untergeordnete Sammlungen enthält und ein Feld in einem Dokument dieser Sammlungen geändert wird, wird der Platzhalter {username}
nicht ausgelöst. Wenn Sie auf Ereignisse in Untersammlungen reagieren möchten, verwenden Sie den Multi-Segment-Platzhalter {username=**}
.
Platzhalterübereinstimmungen werden aus Dokumentpfaden extrahiert. Sie können beliebig viele Platzhalter für explizite Sammlungs- oder Dokument-IDs festlegen. Sie können bis zu einen Platzhalter mit mehreren Segmenten wie {username=**}
verwenden.
Ereignisstrukturen
Dieser Trigger löst die Funktion mit einem Ereignis wie diesem aus:
{ "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 } }
Jedes Document
-Objekt enthält ein oder mehrere Value
-Objekte. Informationen zu Typreferenzen finden Sie in der Dokumentation zu Value
. Diese sind besonders hilfreich, wenn Sie eine Programmiersprache wie Go zum Schreiben Ihrer Funktionen verwenden.
Firestore-Datenbank einrichten
Sie benötigen eine Cloud Firestore-Datenbank, um die Beispiele in diesem Dokument zu testen. Sie muss vorhanden sein, bevor Sie die Funktionen bereitstellen. Wenn Sie noch keine Firestore-Datenbank haben, erstellen Sie so eine:
Klicken Sie auf Nativen Modus auswählen.
Wählen Sie die Region (Standort) aus, in der sich die Datenbank befinden soll. Diese Entscheidung ist endgültig.
Klicken Sie auf Create database (Datenbank erstellen).
Das Firestore-Datenmodell besteht aus Sammlungen, die Dokumente enthalten. Jedes Dokument enthält eine Reihe von Schlüssel/Wert-Paaren.
Die in dieser Anleitung erstellten Funktionen werden ausgelöst, wenn Sie Änderungen an einem Dokument innerhalb einer angegebenen Sammlung vornehmen.
Beispiel 1: Hello Firestore-Funktion
Die folgende beispielhafte Cloud Functions-Funktion gibt die Felder eines auslösenden Firestore-Ereignisses aus:
Node.js
Decodieren Sie die Ereignisdaten mit protobufjs. Fügen Sie google.events.cloud.firestore.v1
data.proto
in Ihre Quelle ein.
Python
Einfach loslegen (Go)
Java
C#
Funktion "Hello Firestore" bereitstellen
Richten Sie Ihre Firestore-Datenbank ein, falls noch nicht geschehen.
Führen Sie den folgenden Befehl in dem Verzeichnis aus, das den Beispielcode (oder im Fall von Java die Datei
pom.xml
) enthält, um die Hello Firestore-Funktion mit einem Firestore-Trigger bereitzustellen:gcloud functions deploy FUNCTION_NAME \ --gen2 \ --runtime=RUNTIME \ --region=REGION \ --trigger-location=TRIGGER REGION \ --source=. \ --entry-point=ENTRY_POINT \ --trigger-event-filters=type=google.cloud.firestore.document.v1.written \ --trigger-event-filters=database='(default)' \ --trigger-event-filters-path-pattern=document='users/{username}'
Ersetzen Sie Folgendes:
FUNCTION_NAME
: Ein Name für die bereitgestellte Funktion.RUNTIME
: Die Sprachlaufzeit, die Ihre Funktion verwendet.REGION
: Die Region, in der die Funktion bereitgestellt werden soll.TRIGGER_REGION
: Der Speicherort des Triggers, der der Region der Firestore-Datenbank entsprechen muss.ENTRY_POINT
: Der Einstiegspunkt zur Funktion in Ihrem Quellcode. Dies ist der Code, der beim Ausführen der Funktion ausgeführt wird.
Die anderen Felder unverändert verwenden:
--trigger-event-filters=type=google.cloud.firestore.document.v1.written
gibt an, dass die Funktion ausgelöst wird, wenn ein Dokument gemäß dem Ereignistypgoogle.cloud.firestore.document.v1.written
erstellt, aktualisiert oder gelöscht wird.--trigger-event-filters=database='(default)'
gibt die Firebase-Datenbank an. Verwenden Sie für den Standarddatenbanknamen(default)
.--trigger-event-filters-path-pattern=document='users/{username}'
enthält das Pfadmuster der Dokumente, die auf relevante Änderungen überwacht werden sollen. Dieses Pfadmuster gibt an, dass alle Dokumente in der Sammlungusers
überwacht werden sollen. Weitere Informationen finden Sie unter Informationen zu Pfadmustern.
Funktion "Hello Firestore" testen
Zum Testen der Funktion Hello Firestore richten Sie eine Sammlung mit dem Namen users
in Ihrer Firestore-Datenbank ein:
Klicken Sie auf der Firestore-Datenseite auf Sammlung starten.
Geben Sie
users
als Sammlungs-ID an.Um das erste Dokument der Sammlung hinzuzufügen, akzeptieren Sie unter Erstes Dokument hinzufügen die automatisch generierte Dokument-ID.
Fügen Sie mindestens ein Feld für das Dokument hinzu und geben Sie einen Namen und einen Wert an. In diesem Beispiel lautet der Name „username“ und der Wert „rowan:“
Wenn Sie fertig sind, klicken Sie auf Speichern.
Dadurch wird ein neues Dokument erstellt und die Funktion wird ausgelöst.
Klicken Sie auf der Übersichtsseite "Cloud Functions" in der Google Cloud Console auf den verknüpften Namen der Funktion, um Funktionsdetails zu öffnen und zu prüfen, ob die Funktion ausgelöst wurde.
Öffnen Sie den Tab Logs und suchen Sie nach diesem String:
Function triggered by change to: //firestore.googleapis.com/projects/your-project-id/databases/(default)'
Beispiel 2: In Großbuchstaben konvertieren-Funktion
In diesem Beispiel wird der vom Nutzer hinzugefügte Wert abgerufen, der String an dieser Stelle in Großbuchstaben umgewandelt und der Wert durch den String in Großbuchstaben ersetzt:
Node.js
Decodieren Sie die Ereignisdaten mit protobufjs. Fügen Sie google.events.cloud.firestore.v1
data.proto
in Ihre Quelle ein.
Python
Einfach loslegen (Go)
Java
C#
Funktion "In Großbuchstaben umwandeln" bereitstellen
Richten Sie Ihre Firestore-Datenbank ein, falls noch nicht geschehen.
Verwenden Sie den folgenden Befehl, um eine Funktion bereitzustellen, die durch Schreibereignisse im Dokument
companies/{CompanyId}
ausgelöst wird:gcloud functions deploy FUNCTION_NAME \ --gen2 \ --runtime=RUNTIME \ --trigger-location=TRIGGER REGION \ --region=REGION \ --source=. \ --entry-point=ENTRY_POINT \ --trigger-event-filters=type=google.cloud.firestore.document.v1.written \ --trigger-event-filters=database='(default)' \ --trigger-event-filters-path-pattern=document='messages/{pushId}'
Ersetzen Sie Folgendes:
FUNCTION_NAME
: Ein Name für die bereitgestellte Funktion.RUNTIME
: Die Sprachlaufzeit, die Ihre Funktion verwendet.REGION
: Die Region, in der die Funktion bereitgestellt werden soll.TRIGGER_REGION
: Der Speicherort des Triggers, der der Region der Firestore-Datenbank entsprechen muss.ENTRY_POINT
: Der Einstiegspunkt zur Funktion in Ihrem Quellcode. Dies ist der Code, der beim Ausführen der Funktion ausgeführt wird.
Die anderen Felder unverändert verwenden:
--trigger-event-filters=type=google.cloud.firestore.document.v1.written
gibt an, dass die Funktion ausgelöst wird, wenn ein Dokument gemäß dem Ereignistypgoogle.cloud.firestore.document.v1.written
erstellt, aktualisiert oder gelöscht wird.--trigger-event-filters=database='(default)'
gibt die Firestore-Datenbank an. Verwenden Sie für den Standarddatenbanknamen(default)
.--trigger-event-filters-path-pattern=document='messages/{pushId}'
enthält das Pfadmuster der Dokumente, die auf relevante Änderungen überwacht werden sollen. Dieses Pfadmuster gibt an, dass alle Dokumente in der Sammlungmessages
überwacht werden sollen. Weitere Informationen finden Sie unter Informationen zu Pfadmustern.
Funktion "In Großbuchstaben umwandeln" testen
Richten Sie eine Sammlung mit dem Namen messages
in Ihrer Firestore-Datenbank ein, um die gerade bereitgestellte Funktion In Großbuchstaben umwandeln zu testen:
Klicken Sie auf Sammlung starten.
Geben Sie
messages
als Sammlungs-ID an.Um das erste Dokument der Sammlung hinzuzufügen, akzeptieren Sie unter Erstes Dokument hinzufügen die automatisch generierte Dokument-ID.
Um die bereitgestellte Funktion auszulösen, fügen Sie ein Dokument mit dem Namen "Original" und einem Feldwert in Kleinbuchstaben hinzu. Beispiel:
Beim Speichern des Dokuments wird das Wort in Kleinbuchstaben im Wertfeld in ein Wort in Großbuchstaben umgewandelt.
Wenn Sie den Feldwert anschließend so bearbeiten, dass er Kleinbuchstaben enthält, wird die Funktion noch einmal ausgelöst. Dadurch werden alle Kleinbuchstaben in Großbuchstaben umgewandelt.
Beschränkungen
Beachten Sie die folgenden Einschränkungen für Firestore-Trigger für Cloud Functions:
- Cloud Functions (1. Generation) erfordert eine vorhandene „(Standard)“-Datenbank im nativen Firestore-Modus. Benannte Firestore-Datenbanken oder der Datastore-Modus werden nicht unterstützt. Verwenden Sie Cloud Functions (2. Generation), um Ereignisse in solchen Fällen zu konfigurieren.
- Die Reihenfolge ist nicht garantiert. Schnelle Änderungen können Funktionsaufrufe in einer unvorhergesehenen Reihenfolge auslösen.
- Ereignisse werden mindestens einmal übergeben. Ein einzelnes Ereignis kann aber zu mehreren Funktionsaufrufen führen. Vermeiden Sie die Abhängigkeit von genau einmal vorkommenden Verfahren und schreiben Sie idempotente Funktionen.
- Firestore im Datastore-Modus erfordert Cloud Functions (2nd gen). Cloud Functions (1st Gen) unterstützt den Datastore-Modus nicht.
- Ein Trigger ist einer einzelnen Datenbank zugeordnet. Sie können keinen Trigger erstellen, der mit mehreren Datenbanken übereinstimmt.
- Durch das Löschen einer Datenbank werden Trigger für diese Datenbank nicht automatisch gelöscht. Der Trigger sendet keine Ereignisse mehr, bleibt aber bestehen, bis Sie den Trigger löschen.
- Wenn ein übereinstimmendes Ereignis die maximale Anfragegröße überschreitet, wird das Ereignis möglicherweise nicht an Cloud Functions (1st gen) gesendet.
- Ereignisse, die aufgrund der Anfragegröße nicht zugestellt werden, werden in Plattformlogs protokolliert und auf die Lognutzung für das Projekt angerechnet.
- Sie finden diese Logs im Log-Explorer mit der Meldung "Ereignis kann nicht an die Cloud Functions-Funktion gesendet werden, da die Größe das Limit für die 1. Generation überschreitet..." mit dem Schweregrad
error
. Sie finden den Funktionsnamen im FeldfunctionName
. Wenn sich das FeldreceiveTimestamp
noch innerhalb einer Stunde befindet, können Sie den tatsächlichen Ereignisinhalt ableiten. Lesen Sie dazu das betreffende Dokument mit einem Snapshot vor und nach dem Zeitstempel. - So können Sie das verhindern:
- Zu Cloud Functions (2. Generation) migrieren und upgraden
- Dokument verkleinern
- Löschen Sie die betreffenden Cloud Functions-Funktionen
- Sie können das Logging selbst mithilfe von Ausschlüssen deaktivieren. Die entsprechenden Ereignisse werden jedoch weiterhin nicht zugestellt.