С Cloud Functions v2 вы можете запускать функции в ответ на пользовательские события . Это события, предоставляемые специальными или дополнительными поставщиками событий, в отличие от событий Firebase, изначально поддерживаемых Firebase SDK для облачных функций.
Во время общедоступной предварительной версии доступные настраиваемые события предоставляются расширениями Firebase. Вы можете установить расширение в свое приложение, а затем реагировать на пользовательские события в этом базовом процессе:
- Установите расширение, предоставляющее одно или несколько настраиваемых событий.
- Обработайте тип события, развернув обработчик
onCustomEventPublished
. В этой функции проанализируйте полезные данные, возвращенные в объектеCloudEvent
, и выполните любую пользовательскую логику, требуемую вашим приложением.
Например, расширение, предназначенное для помощи приложениям в обработке больших изображений, может генерировать событие по завершении изменения размера изображения. Приложения с установленным этим расширением могут обрабатывать событие завершения, обновляя ссылки в приложении, чтобы они указывали на версии изображения с измененным размером.
Все пользовательские события соответствуют формату событий CloudEvents JSON . Ключевую информацию, такую как список доступных событий и подробные сведения о полезной нагрузке событий, см. в документации по конкретному расширению.
Обработка пользовательского события
Как только вы обнаружите пользовательское событие, доступное из установленного расширения, вы можете обработать это событие с помощью
Обработчик onCustomEventPublished
. Сначала импортируйте этот обработчик из Eventarc SDK вместе с Firebase Admin SDK для Node.js для вашей пользовательской логики и SDK logger
для обработки ошибок:
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) => { ... });