使用 Cloud Functions(第 2 代),您可以触发函数以响应自定义事件。这些是由特殊或额外的事件提供者提供的事件,而不是 Firebase SDK for Cloud Functions 原生支持的 Firebase 事件。通过自定义事件触发器,您的应用程序可以响应 Firebase Extensions 提供的事件,或者您可以发布自己的自定义事件和触发器函数来响应它们。
所有自定义事件都符合CloudEvents JSON 事件格式并发布到Eventarc 。 Eventarc使用费适用。
使用自定义事件触发函数
您可以发布自定义事件(或从 Firebase 扩展中获取事件)并触发函数以响应这些事件,方法是实现以下基本流程:
- 将所需的事件发布到 Eventarc 频道,或确定您已安装的扩展程序提供的可用事件。
- 在您的函数代码中,使用
onCustomEventPublished
处理程序订阅 Eventarc 通道上的事件。 - 在该函数中,解析 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) => { ... });