建立及處理自訂事件觸發條件

使用 Cloud Functions (第 2 代) 時,可觸發函式以回應 「事件」。這些事件是由特別活動或其他事件提供者提供, 而不是 Cloud Functions 的 Firebase SDK 原生支援的 Firebase 事件。 透過自訂事件觸發條件,您的應用程式可以回應以下項目提供的事件: 也可以自行發布 並觸發函式以回應這些事件

所有自訂事件都符合 CloudEvents JSON 事件格式 並發布至 Eventarc。 Eventarc 使用費

透過自訂事件觸發函式

您可以發布自訂事件 (或從 Firebase 擴充功能取得事件),並 藉由實作這個基本流程,觸發函式以回應這些事件:

  1. 將所需的事件發布至 Eventarc 管道,或是找出可用的事件 事件。
  2. 在函式程式碼中,使用以下指令訂閱 Eventarc 頻道上的事件 事件處理常式
  3. 在函式中,剖析 CloudEvent 物件,並執行應用程式所需的自訂邏輯。

舉例來說,遊戲應用程式可能想在使用者進入遊戲時傳送通知給他們 也可以將排行榜排名維持在前十名這個應用程式可以發布 排行榜事件傳送至預設管道,然後處理 傳送指定推播通知給使用者的功能。

在其他 舉例來說,如果擴充功能是專門協助應用程式處理大型圖片,可能會 這個事件。已安裝這項擴充功能的應用程式 可以藉由更新應用程式中的連結,讓 Google 處理完成事件 經過調整的圖片大小

將活動發布至頻道

Eventarc 事件會發布至 頻道。 管道可將相關活動分組及管理存取權 授予其要求的權限。安裝擴充功能或部署會使用 自訂事件時,Firebase 就會自動建立名為 us-central1 區域的 firebase。Firebase Admin SDK 提供 用於發布至頻道的 eventarc 子套件。

如要使用 預設頻道:

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 也會設定 環境變數 EVENTARC_CLOUD_EVENT_SOURCE,也就是指定 事件。如果要在 Cloud Functions for Firebase 以外的地方發布事件, 您必須在事件酬載中明確新增 source 欄位。

處理自訂事件

您可以使用 onCustomEventPublishedon_custom_event_published 處理常式中的指示操作。首先,從 Eventarc SDK 匯入這個處理常式,以及 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

在函式程式碼中傳入事件名稱,如函式範例所示:

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

針對每項特定擴充功能,事件物件中傳回的酬載 可讓您針對應用程式流程執行自訂邏輯的資料。在本 情況下,函式會使用 Admin SDK 複製調整大小後的相關中繼資料 連結至 Cloud Firestore 中的集合,從 活動提供的 subject,並從提供的 data 儲存中繼資料 事件。

在非預設頻道上發布及處理事件

如果您有特殊權限需求,就適合使用自訂管道 或不需要相同層級的瀏覽權限和存取權 預設事件。您可以使用下列功能建立自己的頻道: Google Cloud 控制台。您必須在同一個管道發布及訂閱事件。

如果自訂事件是在非預設管道發布, 您需要在函式程式碼中指定管道。舉例來說,如果您在 來處理在非預設管道發布的事件 us-west1 位置,您需要指定頻道,如下所示:

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)
    # ...