使用 Cloud Functions (第 2 代) 即可觸發函式以回應 事件。這些事件是由特別活動或其他事件提供者提供, 而不是 Cloud Functions 的 Firebase SDK 原生支援 Firebase 事件。 透過自訂事件觸發條件,您的應用程式可以回應以下項目提供的事件: Firebase Extensions,你也可以發布自己的自訂廣告素材 並觸發函式以回應這些事件
所有自訂事件都符合 CloudEvents JSON 事件格式 並發布至 Eventarc。 Eventarc 須支付使用費。
透過自訂事件觸發函式
您可以發布自訂事件 (或從 Firebase 擴充功能取得事件),並 藉由實作這個基本流程,觸發函式以回應這些事件:
- 將所需的事件發布至 Eventarc 管道,或是找出可用的事件 事件。
- 在函式程式碼中,使用以下指令訂閱 Eventarc 頻道上的事件 事件處理常式
- 在函式中,剖析 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
欄位。
處理自訂事件
您可以使用
onCustomEventPublished
或
on_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)
# ...