Benutzerdefinierte Ereignistrigger erstellen und verarbeiten

Mit Cloud Functions (2. Generation) können Sie Funktionen als Reaktion auf benutzerdefinierte Funktionen auslösen. Events Diese Ereignisse werden von speziellen oder zusätzlichen Anbietern im Gegensatz zu den Firebase-Ereignissen, die nativ vom Firebase SDK für Cloud Functions unterstützt werden. Über benutzerdefinierte Ereignistrigger kann Ihre App auf Ereignisse reagieren, die von Firebase Extensions, oder Sie veröffentlichen Ihre eigene benutzerdefinierte und Funktionen als Reaktion darauf auslösen.

Alle benutzerdefinierten Ereignisse entsprechen dem JSON-Ereignisformat von CloudEvents und werden in Eventarc veröffentlicht. Eventarc Es fallen Nutzungsgebühren an.

Funktionen mit benutzerdefinierten Ereignissen auslösen

Sie können benutzerdefinierte Ereignisse veröffentlichen (oder Ereignisse von Firebase-Erweiterungen abrufen) und Funktionen als Reaktion auf diese Ereignisse auslösen, indem Sie diesen grundlegenden Ablauf implementieren:

  1. Veröffentlichen Sie die gewünschten Ereignisse in einem Eventarc-Kanal oder suchen Sie nach verfügbaren Ereignissen Ereignisse, die von einer bei Ihnen installierten Erweiterung bereitgestellt werden.
  2. Abonnieren Sie in Ihrem Funktionscode Ereignisse auf dem Eventarc-Kanal mit einem Ereignishandler.
  3. Analysieren Sie in der Funktion die im CloudEvent-Objekt zu erstellen und eine benutzerdefinierte Logik auszuführen, die Ihre Anwendung erfordert.

Beispiel: Eine Spiele-App möchte Nutzern eine Benachrichtigung senden, sobald sie oder die Bestenliste der zehn wichtigsten Mitbewerber zu verlassen. Diese App könnte veröffentlichen Leaderboard-Ereignisse auf den Standardkanal übertragen und dann in einem , die gezielt Push-Benachrichtigungen an Nutzer sendet.

In einem anderen So kann eine Erweiterung, die Anwendungen bei der Verarbeitung großer Bilder unterstützen soll, -Ereignis, wenn die Bildgröße angepasst wurde. Apps mit dieser Erweiterung das Abschlussereignis verarbeiten kann, indem die Links in der App so aktualisiert werden, dass sie auf angepasste Versionen des Bildes.

Ereignisse in einem Kanal veröffentlichen

Eventarc-Ereignisse werden in Kanälen veröffentlicht. Mit Channels können Sie ähnliche Ereignisse gruppieren und Zugriffsberechtigungen verwalten. Wenn Sie eine Erweiterung installieren oder eine Funktion bereitstellen, benutzerdefinierten Ereignissen erstellen, erstellt Firebase automatisch einen Standard-Channel mit dem Namen firebase in der Region us-central1. Die Firebase Admin SDK bietet Ein eventarc-Teilpaket für die Veröffentlichung auf Kanälen

Um ein Ereignis von einem vertrauenswürdigen Server (oder einer anderen Funktion) mithilfe des Standardkanal:

import {getEventarc} from 'firebase-admin/eventarc';

getEventarc().channel().publish({
    type: 'achieved-leaderboard',
    subject: 'Welcome to the top 10',
    data: {
      message: 'You have achieved the nth position in our leaderboard!  To see . . .'
    }
});

Neben dem automatischen Erstellen des Standard-Channels wird in Firebase die Umgebungsvariable EVENTARC_CLOUD_EVENT_SOURCE festgelegt, die die Quelle des Ereignisses angibt. Wenn Sie Ereignisse außerhalb von Cloud Functions for Firebase veröffentlichen, müssen Sie das Feld source explizit in Ihre Ereignisnutzlast einfügen.

Benutzerdefinierte Ereignisse verarbeiten

Sie können alle benutzerdefinierten Ereignisse, einschließlich Erweiterungsereignisse, mit den Handlern onCustomEventPublished oder on_custom_event_published verarbeiten. Importieren Sie zuerst diesen Handler aus dem Eventarc SDK zusammen mit dem Firebase Admin SDK:

Node.js

const {onCustomEventPublished} = require("firebase-functions/v2/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

Python

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

Übergeben Sie in Ihrem Funktionscode den Ereignisnamen, wie für die Beispielfunktion gezeigt:

Node.js

exports.onimageresized = onCustomEventPublished(
    "firebase.extensions.storage-resize-images.v1.complete",
    (event) => {
      logger.info("Received image resize completed event", event);
      // For example, write resized image details into Firestore.
      return getFirestore()
          .collection("images")
          .doc(event.subject.replace("/", "_")) // original file path
          .set(event.data); // resized images paths and sizes
    });

Python

@eventarc_fn.on_custom_event_published(
    event_type="firebase.extensions.storage-resize-images.v1.complete")
def onimageresized(event: eventarc_fn.CloudEvent) -> None:
    print("Received image resize completed event: ", event.type)

    if not isinstance(event.subject, str):
        print("No 'subject' data.")
        return

    # For example, write resized image details into Firestore.
    firestore_client: google.cloud.firestore.Client = firestore.client()
    collection = firestore_client.collection("images")
    doc = collection.document(event.subject.replace("/", "_"))  # original file path
    doc.set(event.data)  # resized images paths and sizes

Für jede bestimmte Erweiterung liefert die im Ereignisobjekt zurückgegebene Nutzlast Daten, mit denen Sie benutzerdefinierte Logik für Ihren Anwendungsablauf ausführen können. In dieser verwendet die Funktion Admin SDK, um Metadaten zur geänderten Bild zu einer Sammlung in Cloud Firestore. Der Dateiname wird vom subject vom Ereignis bereitgestellt; Metadaten aus der angegebenen data werden gespeichert durch das Ereignis.

Ereignisse auf nicht standardmäßigen Kanälen veröffentlichen und verarbeiten

Benutzerdefinierte Kanäle können nützlich sein, wenn Sie spezielle Berechtigungsanforderungen oder andere Anforderungen haben und nicht für alle Ereignisse dieselbe Sichtbarkeit und Zugriffsebene wünschen. Du kannst deine eigenen Kanäle mithilfe der Google Cloud Console: Veranstaltungen können nur auf demselben Kanal veröffentlicht und abonniert werden.

Wenn ein benutzerdefiniertes Ereignis auf einem nicht standardmäßigen Kanal veröffentlicht wird, müssen Sie den Kanal im Funktionscode angeben. Wenn Sie beispielsweise Ereignisse verarbeiten möchten, die in einem nicht standardmäßigen Kanal für die us-west1 Standort befindet, müssen Sie den Kanal wie hier gezeigt angeben:

Node.js

import { onCustomEventPublished } from "firebase-functions/v2/eventarc";

export const func = onCustomEventPublished(
    {
      eventType: "firebase.extensions.storage-resize-images.v1.complete",
      channel: "locations/us-west1/channels/firebase",
      region: "us-west1",
    },
    (event) => { ... });

Python

@eventarc_fn.on_custom_event_published(
    event_type="firebase.extensions.storage-resize-images.v1.complete",
    channel="locations/us-west1/channels/firebase",
    region="us-west1")
def onimageresizedwest(event: eventarc_fn.CloudEvent) -> None:
    print("Received image resize completed event: ", event.type)
    # ...