获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

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

使用 Cloud Functions(第 2 代),您可以觸發函數以響應自定義事件。這些是由特殊或額外的事件提供者提供的事件,而不是 Firebase SDK for Cloud Functions 原生支持的 Firebase 事件。通過自定義事件觸發器,您的應用程序可以響應 Firebase Extensions 提供的事件,或者您可以發布自己的自定義事件和触發器函數來響應它們。

所有自定義事件都符合CloudEvents JSON 事件格式並發佈到Eventarc 。 Eventarc使用費適用。

使用自定義事件觸發函數

您可以發布自定義事件(或從 Firebase 擴展中獲取事件)並觸發函數以響應這些事件,方法是實現以下基本流程:

  1. 將所需的事件發佈到 Eventarc 頻道,或確定您已安裝的擴展程序提供的可用事件。
  2. 在您的函數代碼中,使用onCustomEventPublished處理程序訂閱 Eventarc 通道上的事件。
  3. 在該函數中,解析 CloudEvent 對像中返回的負載並執行您的應用所需的任何自定義邏輯。

例如,遊戲應用程序可能希望在用戶進入或離開前十名競爭對手的排行榜時向他們發送通知。此應用程序可以將排行榜事件發佈到默認通道,然後在向用戶發送有針對性的推送通知的函數中處理該事件。

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

將事件發佈到頻道

Eventarc 事件發佈到channels中。頻道是對相關事件進行分組和管理訪問權限的一種方式。當您安裝擴展程序或部署使用自定義事件的函數時,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字段。

使用onCustomEventPublished處理事件

您可以使用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中保存元數據。

在非默認通道上發布和處理事件

如果您有特殊權限需求或其他要求,並且不希望所有事件具有相同級別的可見性和訪問權限,則自定義渠道可能很有用。您可以使用Google Cloud 控制台創建自己的頻道。事件的發布和訂閱必須在同一個頻道上完成。

如果自定義事件發佈在非默認通道上,您需要在函數代碼中指定通道。例如,如果要處理在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) => { ... });