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

您可以使用 Cloud Functions (第 2 代),依據自訂事件觸發函式。這些事件是由特殊或其他事件供應商提供,而不是由 Cloud Functions 專用 Firebase SDK 原生支援的 Firebase 事件。透過自訂事件觸發條件,應用程式可以回應 Firebase Extensions 提供的事件,或者您也可以發布自己的自訂事件,以及觸發函式以回應這些事件。

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

透過自訂事件觸發函式

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

  1. 將所需的事件發布至 Eventarc 管道,或是找出您安裝的擴充功能提供的可用事件。
  2. 在函式程式碼中,使用事件處理常式訂閱 Eventarc 頻道上的事件。
  3. 透過函式,剖析 CloudEvent 物件傳回的酬載,並執行應用程式所需的自訂邏輯。

舉例來說,某遊戲應用程式可能想在使用者進入或退出前十名競爭對手排行榜時傳送通知。這個應用程式可將排行榜事件發布至預設管道,然後在傳送指定推播通知的函式中處理事件。

再舉一個例子,如果擴充功能可協助應用程式處理大型圖片,可能會在調整圖片大小時發出事件。如果應用程式已安裝這項擴充功能,就可以藉由更新應用程式中的連結,指向調整大小後的圖片版本,處理完成事件。

將活動發布至頻道

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