Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Триггеры базы данных в реальном времени

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

В типичном жизненном цикле функция базы данных Firebase Realtime выполняет следующие действия:

  1. Ожидает изменений определенного пути к базе данных реального времени.
  2. Запускается при возникновении события и выполняет свои задачи.
  3. Получает объект данных, содержащий моментальный снимок данных, хранящихся по этому пути.

Вы можете активировать функцию в ответ на запись, создание, обновление или удаление узлов базы данных в базе данных Firebase Realtime.

Активировать функцию при изменении базы данных Firebase Realtime

Используйте подпакет firebase firebase-functions/v2/database , чтобы создать функцию, которая обрабатывает события базы данных Firebase Realtime. Чтобы управлять запуском функции, укажите один из обработчиков событий и укажите путь к базе данных реального времени, где он будет прослушивать события.

Установка функционального местоположения

Расстояние между расположением экземпляра базы данных реального времени и расположением функции может привести к значительной задержке в сети. Кроме того, несоответствие между регионами может привести к сбою развертывания. Чтобы избежать подобных ситуаций, укажите расположение функции так, чтобы оно совпадало с расположением экземпляра базы данных .

Обработка событий базы данных в реальном времени

Функции позволяют обрабатывать события базы данных реального времени на двух уровнях специфичности; вы можете прослушивать только события записи, создания, обновления или удаления, или вы можете прослушивать любое изменение любого рода в ссылке.

Доступны следующие обработчики для реагирования на события базы данных реального времени:

  • onValueWritten() только при записи данных в базу данных реального времени.
  • onValueCreated() только при создании данных в базе данных реального времени.
  • onValueUpdated() срабатывает только при обновлении данных в базе данных реального времени.
  • onValueDeleted() только при удалении данных в базе данных реального времени.

Укажите экземпляр и путь

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

Например, используя onValueWritten() для иллюстрации:

# All Realtime Database instances in default function region us-central1 at path "/user/{uid}"
# There must be at least one Realtime Database present in us-central1.
const onwrittenfunctiondefault = onValueWritten("/user/{uid}", (event) => {
  // …
});

# Instance named "my-app-db-2", at path "/user/{uid}".
# The "my-app-db-2" instance must exist in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid}",
    instance: "my-app-db-2"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

# Instance with "my-app-db-" prefix, at path "/user/{uid}", where uid ends with @gmail.com.
# There must be at least one Realtime Database with "my-app-db-*" prefix in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid=*@gmail.com}",
    instance: "my-app-db-*"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

Эти параметры предписывают вашей функции обрабатывать записи по определенному пути в экземпляре базы данных реального времени.

Спецификации пути соответствуют всем записям, которые касаются пути, включая записи, которые происходят в любом месте ниже этого пути. Если вы установите путь для своей функции как /foo/bar , он будет соответствовать событиям в обоих этих местах:

 /foo/bar
 /foo/bar/baz/really/deep/path

В любом случае Firebase интерпретирует событие как событие /foo/bar , а данные события включают старые и новые данные в /foo/bar . Если данные события могут быть большими, рассмотрите возможность использования нескольких функций на более глубоких путях вместо одной функции рядом с корнем вашей базы данных. Для наилучшей производительности запрашивайте данные только на самом глубоком возможном уровне.

Подстановочные знаки и захват

Вы можете использовать {key} , {key=*} , {key=prefix*} , {key=*suffix} для захвата. * , prefix* , *suffix для подстановки одного сегмента. Примечание. ** представляет собой многосегментный подстановочный знак, который RTDB не поддерживает. См. Общие сведения о шаблонах пути .

Подстановочные знаки пути. Вы можете указать компонент пути как подстановочный знак:

  • Используя звездочку, * . Например, foo/* соответствует любому дочернему элементу на один уровень иерархии узлов ниже foo/ .
  • Используя сегмент, содержащий ровно звездочку, * . Например, foo/app*-us соответствует любым дочерним сегментам ниже foo/ с префиксом app и суффиксом -us .

Пути с подстановочными знаками могут соответствовать нескольким событиям, например, из одной записи. Вставка из

{
  "foo": {
    "hello": "world",
    "firebase": "functions"
  }
}

соответствует пути "/foo/*" дважды: один раз с "hello": "world" и снова с "firebase": "functions" .

Захват пути. Вы можете записывать совпадения путей в именованные переменные для использования в коде вашей функции (например, /user/{uid} , /user/{uid=*-us} ).

Значения переменных захвата доступны в объекте database.DatabaseEvent.params вашей функции.

Подстановочные знаки экземпляра. Вы также можете указать компонент экземпляра, используя подстановочные знаки. Подстановочный знак экземпляра может иметь префикс, суффикс или и то, и другое (например my-app-*-prod ).

Подстановочный знак и ссылка на захват

С облачными функциями (2-го поколения) и базой данных реального времени можно использовать шаблон при указании ref и instance . Каждый интерфейс триггера будет иметь следующие параметры для определения области действия функции:

Указание ref Указание instance Поведение
Одноместный ( /foo/bar ) Не указан Обработчик областей для всех экземпляров в области функции.
Одноместный ( /foo/bar ) Сингл ( 'my-new-db' ) Обработчик областей для конкретного экземпляра в области функции.
Одноместный ( /foo/bar ) Шаблон ( 'inst-prefix*' ) Обработчик областей для всех экземпляров, соответствующих шаблону в области функции.
Шаблон ( /foo/{bar} ) Не указан Обработчик областей для всех экземпляров в области функции.
Шаблон ( /foo/{bar} ) Сингл ( 'my-new-db' ) Обработчик областей для конкретного экземпляра в области функции.
Шаблон ( /foo/{bar} ) Шаблон ( 'inst-prefix*' ) Обработчик областей для всех экземпляров, соответствующих шаблону в области функции.

Обрабатывать данные о событиях

При обработке события базы данных реального времени возвращаемый объект данных представляет собой DataSnapshot .

Для onValueWritten или onValueUpdated первым параметром является объект Change , который содержит два моментальных снимка, представляющих состояние данных до и после инициирующего события.

Для onValueCreated и onValueDeleted возвращаемый объект данных представляет собой снимок созданных или удаленных данных.

В этом примере функция извлекает снимок для указанного пути foo/bar как snap , преобразует строку в этом месте в верхний регистр и записывает измененную строку в базу данных:

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
export makeuppercase = onValueCreated("foo/bar", (event) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      functions.logger.log('Uppercasing', event.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return event.data.ref.parent.child('uppercase').set(uppercase);
    });

Чтение предыдущего значения

Объект Change имеет свойство before , которое позволяет проверить, что было сохранено в базе данных реального времени до события. Свойство before возвращает DataSnapshot , в котором все методы (например, val() и exists() ) ссылаются на предыдущее значение. Вы можете снова прочитать новое значение, используя исходный DataSnapshot или прочитав свойство after . Это свойство любого Change представляет собой еще один DataSnapshot данных, представляющий состояние данных после того, как произошло событие.

Например, свойство before можно использовать для того, чтобы при первом создании функция выводила текст только в верхний регистр:

    exports makeuppercase = onValueWritten("/messages/{pushId}/original", (event) => {
          // Only edit data when it is first created.
          if (event.data.before.exists()) {
            return null;
          }
          // Exit when the data is deleted.
          if (!event.data.after.exists()) {
            return null;
          }
          // Grab the current value of what was written to the Realtime Database.
          const original = event.data.after.val();
          console.log('Uppercasing', event.params.pushId, original);
          const uppercase = original.toUpperCase();
          // You must return a Promise when performing asynchronous tasks inside a Functions such as
          // writing to the Firebase Realtime Database.
          // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
          return event.data.after.ref.parent.child('uppercase').set(uppercase);
        });