Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

創建和處理自定義事件觸發器

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

使用 Cloud Functions(第 2 代),您可以觸發函數以響應自定義事件。這些是由特殊或額外的事件提供者提供的事件,而不是 Firebase SDK for Cloud Functions 原生支持的 Firebase 事件。

在公開預覽期間,可用的自定義事件由 Firebase Extensions 提供。您可以在您的應用程序中安裝擴展程序,然後響應此基本流程中的自定義事件:

  1. 安裝提供一個或多個自定義事件的擴展。
  2. 通過部署onCustomEventPublished處理程序來處理事件類型。在此函數中,解析CloudEvent對像中返回的有效負載,並執行您的應用所需的任何自定義邏輯。

例如,旨在幫助應用程序處理大圖像的擴展可能會在圖像大小調整完成時發出事件。安裝了此擴展的應用程序可以通過更新應用程序中的鏈接以指向圖像的調整大小版本來處理完成事件。

所有自定義事件都符合CloudEvents JSON 事件格式。有關可用事件列表和事件負載詳細信息等關鍵信息,請參閱特定擴展的文檔。

處理自定義事件

一旦您從已安裝的擴展中發現了可用的自定義事件,您就可以使用
onCustomEventPublished處理程序。首先,從 Eventarc SDK 導入此處理程序以及用於 Node.js 的 Firebase Admin SDK 用於您的自定義邏輯和用於處理錯誤的logger SDK:

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");

在您的函數代碼中,傳入事件名稱,如示例函數onimageresized所示:

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
    });

對於每個特定的擴展,事件對像中返回的有效負載提供了可用於為應用程序流執行自定義邏輯的數據。在這種情況下,該函數使用 Admin SDK 將有關調整大小的圖像的元數據複製到 Cloud Firestore 中的集合,從事件提供的subject中獲取文件名,並從事件提供的data中保存元數據。

處理非默認通道上的事件

上面的示例假設圖像完成事件發佈在默認通道上,在擴展中指定的默認位置us-central1中。如果自定義事件發佈在非默認通道上,您需要在函數代碼中指定通道。例如,如果要處理在us-west1位置的非默認通道中發布的事件,則需要指定通道,如下所示:

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) => { ... });