Mit Cloud Functions (2. Generation) können Sie Funktionen als Reaktion auf benutzerdefinierte Ereignisse auslösen. Diese Ereignisse werden von speziellen oder zusätzlichen Ereignisanbietern im Gegensatz zu den Firebase-Ereignissen bereitgestellt, die vom Firebase SDK für Cloud Functions nativ unterstützt werden. Über benutzerdefinierte Ereignistrigger kann Ihre App auf Ereignisse reagieren, die von Firebase Extensions bereitgestellt werden. Sie können aber auch eigene benutzerdefinierte Ereignisse veröffentlichen und Funktionen als Reaktion darauf auslösen.
Alle benutzerdefinierten Ereignisse entsprechen dem CloudEvents-JSON-Ereignisformat und werden in Eventarc veröffentlicht. Eventarc Nutzungsgebühren fallen 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:
- Veröffentlichen Sie die gewünschten Ereignisse in einem Eventarc-Kanal oder ermitteln Sie verfügbare Ereignisse, die von einer installierten Erweiterung bereitgestellt werden.
- Abonnieren Sie in Ihrem Funktionscode Ereignisse im Eventarc-Kanal mit einem Ereignishandler.
- Analysieren Sie in der Funktion die Nutzlast, die im CloudEvent-Objekt zurückgegeben wird, und führen Sie die benutzerdefinierte Logik aus, die Ihre App benötigt.
Eine Spiele-App möchte beispielsweise Benachrichtigungen an Nutzer senden, wenn sie die Bestenliste der zehn besten Mitbewerber betreten oder verlassen. Diese App könnte Bestenlistenereignisse im Standardkanal veröffentlichen und das Ereignis dann in einer Funktion verarbeiten, die gezielte Push-Benachrichtigungen an Nutzer sendet.
In einem anderen Beispiel könnte eine Erweiterung, die Apps bei der Verarbeitung großer Bilder unterstützt, ein Ereignis ausgeben, wenn die Größe eines Bildes geändert wurde. Apps, in denen diese Erweiterung installiert ist, könnten das Ereignis verarbeiten, indem sie Links in der App aktualisieren, die auf die geänderten Versionen des Bildes verweisen.
Ereignis in einem Kanal veröffentlichen
Eventarc-Ereignisse werden in
Kanälen veröffentlicht.
Kanäle sind eine Möglichkeit, verwandte Ereignisse zu gruppieren und Zugriffsberechtigungen zu verwalten. Wenn Sie eine Erweiterung installieren oder eine Funktion bereitstellen, die benutzerdefinierte Ereignisse verwendet, erstellt Firebase automatisch einen Standardkanal mit dem Namen firebase in der Region us-central1. Das Firebase Admin SDK bietet
ein eventarc Unterpaket zum Veröffentlichen in Kanälen.
So veröffentlichen Sie ein Ereignis von einem vertrauenswürdigen Server (oder einer anderen Funktion) über den 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 . . .'
}
});
Firebase erstellt nicht nur automatisch den Standardkanal, sondern legt auch die Umgebungsvariable EVENTARC_CLOUD_EVENT_SOURCE fest, die die Quelle des Ereignisses angibt. Wenn Sie Ereignisse außerhalb von Cloud Functions for Firebase,
müssen Sie das Feld source explizit in die Ereignisnutzlast einfügen.
Benutzerdefinierte Ereignisse verarbeiten
Sie können alle benutzerdefinierten Ereignisse, einschließlich Erweiterungsereignisse, mit den
onCustomEventPublished oder
on_custom_event_published
Handlern verarbeiten. Importieren Sie diesen Handler zuerst aus dem Eventarc SDK zusammen mit dem
Firebase Admin SDK:
Node.js
const {onCustomEventPublished} = require("firebase-functions/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 in der 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 Erweiterung enthält die in der Ereignisnutzlast zurückgegebene Nutzlast Daten, mit denen Sie benutzerdefinierte Logik für Ihren Anwendungsablauf ausführen können. In diesem
Fall kopiert die Funktion mit dem Admin SDK Metadaten zum geänderten
Bild in eine Sammlung in Cloud Firestore. Der Dateiname wird aus dem
subject abgerufen, das vom Ereignis bereitgestellt wird, und Metadaten aus dem data gespeichert, das
vom Ereignis bereitgestellt wird.
Ereignisse in nicht standardmäßigen Kanälen veröffentlichen und verarbeiten
Benutzerdefinierte Kanäle können in Fällen nützlich sein, in denen Sie spezielle Berechtigungen oder andere Anforderungen haben und nicht für alle Ereignisse dieselbe Sichtbarkeit und denselben Zugriff wünschen. Sie können eigene Kanäle über die Google Cloud Console erstellen. Das Veröffentlichen und Abonnieren von Ereignissen muss im selben Kanal erfolgen.
Wenn ein benutzerdefiniertes Ereignis in einem nicht standardmäßigen Kanal veröffentlicht wird, müssen Sie den Kanal in Ihrem Funktionscode angeben. Wenn Sie beispielsweise Ereignisse verarbeiten möchten, die in einem nicht standardmäßigen Kanal für den Standort us-west1 veröffentlicht werden, müssen Sie den Kanal wie folgt 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)
# ...