Создание и обработка настраиваемых триггеров событий

С Cloud Functions v2 вы можете запускать функции в ответ на пользовательские события . Это события, предоставляемые специальными или дополнительными поставщиками событий, в отличие от событий Firebase, изначально поддерживаемых Firebase SDK для облачных функций.

Во время общедоступной предварительной версии доступные настраиваемые события предоставляются расширениями Firebase. Вы можете установить расширение в свое приложение, а затем реагировать на пользовательские события в этом базовом процессе:

  1. Установите расширение, предоставляющее одно или несколько настраиваемых событий.
  2. Обработайте тип события, развернув обработчик 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) => { ... });