Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Echtzeit-Datenbank-Trigger

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

In einem typischen Lebenszyklus führt eine Firebase Realtime Database-Funktion Folgendes aus:

  1. Wartet auf Änderungen an einem bestimmten Realtime Database-Pfad.
  2. Löst aus, wenn ein Ereignis eintritt, und führt seine Aufgaben aus.
  3. Empfängt ein Datenobjekt, das eine Momentaufnahme der unter diesem Pfad gespeicherten Daten enthält.

Sie können eine Funktion als Reaktion auf das Schreiben, Erstellen, Aktualisieren oder Löschen von Datenbankknoten in der Firebase-Echtzeitdatenbank auslösen.

Lösen Sie eine Funktion bei Änderungen der Firebase Realtime Database aus

Verwenden Sie das Unterpaket firebase firebase-functions/v2/database , um eine Funktion zu erstellen, die Firebase Realtime Database-Ereignisse verarbeitet. Um zu steuern, wann die Funktion ausgelöst wird, geben Sie einen der Ereignishandler und den Pfad der Echtzeitdatenbank an, in dem sie auf Ereignisse lauschen soll.

Einstellen des Funktionsortes

Die Entfernung zwischen dem Standort einer Realtime Database-Instanz und dem Standort der Funktion kann zu einer erheblichen Netzwerklatenz führen. Außerdem kann eine Nichtübereinstimmung zwischen Regionen zu einem Bereitstellungsfehler führen. Um diese Situationen zu vermeiden, geben Sie den Funktionsspeicherort so an, dass er mit dem Speicherort der Datenbankinstanz übereinstimmt.

Behandlung von Realtime Database-Ereignissen

Mit Funktionen können Sie Realtime Database-Ereignisse auf zwei Spezifitätsebenen verarbeiten; Sie können speziell nur auf Schreib-, Erstellungs-, Aktualisierungs- oder Löschereignisse lauschen, oder Sie können auf jede Art von Änderung an einer Referenz horchen.

Diese Handler zum Reagieren auf Realtime Database-Ereignisse sind verfügbar:

  • onValueWritten() nur ausgelöst, wenn Daten in die Echtzeitdatenbank geschrieben werden.
  • onValueCreated() nur ausgelöst, wenn Daten in der Echtzeitdatenbank erstellt werden.
  • onValueUpdated() nur ausgelöst, wenn Daten in der Echtzeitdatenbank aktualisiert werden.
  • onValueDeleted() nur ausgelöst, wenn Daten in der Echtzeitdatenbank gelöscht werden.

Geben Sie Instanz und Pfad an

Um zu steuern, wann und wo Ihre Funktion ausgelöst werden soll, konfigurieren Sie Ihre Funktion mit einem Pfad und optional einer Realtime Database-Instanz. Wenn Sie keine Instanz angeben, wird die Funktion für alle Realtime Database-Instanzen im Funktionsbereich bereitgestellt. Sie können auch ein Instanzmuster für die Echtzeitdatenbank angeben, das für eine ausgewählte Teilmenge von Instanzen in derselben Region bereitgestellt werden soll.

Verwenden Sie zum Beispiel onValueWritten() zur Veranschaulichung:

# All Realtime Database instances in default function region us-central1 at path "/user/{uid}"
# There must be at least one Realtime Database present in us-central1.
const onwrittenfunctiondefault = onValueWritten("/user/{uid}", (event) => {
  // …
});

# Instance named "my-app-db-2", at path "/user/{uid}".
# The "my-app-db-2" instance must exist in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid}",
    instance: "my-app-db-2"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

# Instance with "my-app-db-" prefix, at path "/user/{uid}", where uid ends with @gmail.com.
# There must be at least one Realtime Database with "my-app-db-*" prefix in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid=*@gmail.com}",
    instance: "my-app-db-*"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

Diese Parameter weisen Ihre Funktion an, Schreibvorgänge an einem bestimmten Pfad innerhalb der Realtime Database-Instanz zu verarbeiten.

Pfadspezifikationen stimmen mit allen Schreibvorgängen überein, die einen Pfad berühren, einschließlich Schreibvorgängen, die irgendwo darunter stattfinden. Wenn Sie den Pfad für Ihre Funktion als /foo/bar festlegen, stimmt er mit Ereignissen an diesen beiden Orten überein:

 /foo/bar
 /foo/bar/baz/really/deep/path

In beiden Fällen interpretiert Firebase, dass das Ereignis unter /foo/bar auftritt und die Ereignisdaten die alten und neuen Daten unter /foo/bar enthalten. Wenn die Ereignisdaten möglicherweise umfangreich sind, sollten Sie erwägen, mehrere Funktionen in tieferen Pfaden anstelle einer einzelnen Funktion in der Nähe des Stammverzeichnisses Ihrer Datenbank zu verwenden. Fordern Sie für die beste Leistung nur Daten auf der tiefstmöglichen Ebene an.

Platzhalter und Erfassung

Sie können {key} , {key=*} , {key=prefix*} , {key=*suffix} für die Erfassung verwenden. * , prefix* , *suffix für Einzelsegment-Platzhalter. Hinweis: ** stellt Platzhalter für mehrere Segmente dar, die RTDB nicht unterstützt. Siehe Pfadmuster verstehen .

Wildcarding für Pfade. Sie können eine Pfadkomponente als Platzhalter angeben:

  • Mit Stern, * . Beispielsweise stimmt foo/* mit allen untergeordneten Knoten eine Ebene der Knotenhierarchie unter foo/ überein.
  • Verwenden Sie ein Segment, das genau Sternchen enthält, * . Beispielsweise stimmt foo/app*-us mit allen untergeordneten Segmenten unterhalb von foo/ mit dem app -Präfix und dem Suffix -us überein.

Pfade mit Platzhaltern können beispielsweise mit mehreren Ereignissen aus einem einzelnen Schreibvorgang übereinstimmen. Eine Einlage von

{
  "foo": {
    "hello": "world",
    "firebase": "functions"
  }
}

stimmt zweimal mit dem Pfad "/foo/*" überein: einmal mit "hello": "world" und erneut mit "firebase": "functions" .

Pfaderfassung. Sie können Pfadübereinstimmungen in benannten Variablen erfassen, die in Ihrem Funktionscode verwendet werden (z. B. /user/{uid} , /user/{uid=*-us} ).

Die Werte der Capture-Variablen sind im Objekt database.DatabaseEvent.params Ihrer Funktion verfügbar.

Platzhalter für Instanzen. Sie können eine Instanzkomponente auch mit Platzhaltern angeben. Ein Instanzplatzhalter kann Präfix, Suffix oder beides haben (z. B. my-app-*-prod ).

Wildcard- und Capture-Referenz

Mit Cloud Functions v2 und Realtime Database kann ein Muster verwendet werden, wenn ref und instance angegeben werden. Jede Trigger-Schnittstelle verfügt über die folgenden Optionen zum Festlegen einer Funktion:

Angabe der ref instance angeben Verhalten
Single ( /foo/bar ) Nicht angeben Beschränkt den Handler auf alle Instanzen im Funktionsbereich.
Single ( /foo/bar ) Single ( 'my-new-db' ) Beschränkt den Handler auf die spezifische Instanz im Funktionsbereich.
Single ( /foo/bar ) Muster ( 'inst-prefix*' ) Beschränkt den Handler auf alle Instanzen, die mit dem Muster im Funktionsbereich übereinstimmen.
Muster ( /foo/{bar} ) Nicht angeben Beschränkt den Handler auf alle Instanzen im Funktionsbereich.
Muster ( /foo/{bar} ) Single ( 'my-new-db' ) Beschränkt den Handler auf die spezifische Instanz im Funktionsbereich.
Muster ( /foo/{bar} ) Muster ( 'inst-prefix*' ) Beschränkt den Handler auf alle Instanzen, die mit dem Muster im Funktionsbereich übereinstimmen.

Ereignisdaten verarbeiten

Bei der Behandlung eines Realtime Database-Ereignisses ist das zurückgegebene Datenobjekt ein DataSnapshot .

Bei onValueWritten oder onValueUpdated Ereignissen ist der erste Parameter ein Change -Objekt, das zwei Snapshots enthält, die den Datenstatus vor und nach dem auslösenden Ereignis darstellen.

Bei onValueCreated und onValueDeleted Ereignissen ist das zurückgegebene Datenobjekt eine Momentaufnahme der erstellten oder gelöschten Daten.

In diesem Beispiel ruft die Funktion den Snapshot für den angegebenen Pfad foo/bar als snap ab, konvertiert die Zeichenfolge an dieser Stelle in Großbuchstaben und schreibt diese geänderte Zeichenfolge in die Datenbank:

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
export makeuppercase = onValueCreated("foo/bar", (event) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      functions.logger.log('Uppercasing', event.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return event.data.ref.parent.child('uppercase').set(uppercase);
    });

Lesen des vorherigen Werts

Das Change Objekt hat eine before -Eigenschaft, mit der Sie überprüfen können, was vor dem Ereignis in der Realtime Database gespeichert wurde. Die before -Eigenschaft gibt einen DataSnapshot zurück, in dem alle Methoden (z. B. val() und exists() ) auf den vorherigen Wert verweisen. Sie können den neuen Wert erneut lesen, indem Sie entweder den ursprünglichen DataSnapshot verwenden oder die after -Eigenschaft lesen. Diese Eigenschaft bei jeder Change ist ein weiterer DataSnapshot , der den Status der Daten nach dem Eintreten des Ereignisses darstellt.

Beispielsweise kann die Eigenschaft before verwendet werden, um sicherzustellen, dass die Funktion Text nur in Großbuchstaben schreibt, wenn sie zum ersten Mal erstellt wird:

    exports makeuppercase = onValueWritten("/messages/{pushId}/original", (event) => {
          // Only edit data when it is first created.
          if (event.data.before.exists()) {
            return null;
          }
          // Exit when the data is deleted.
          if (!event.data.after.exists()) {
            return null;
          }
          // Grab the current value of what was written to the Realtime Database.
          const original = event.data.after.val();
          console.log('Uppercasing', event.params.pushId, original);
          const uppercase = original.toUpperCase();
          // You must return a Promise when performing asynchronous tasks inside a Functions such as
          // writing to the Firebase Realtime Database.
          // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
          return event.data.after.ref.parent.child('uppercase').set(uppercase);
        });