Введение в облачные функции Firebase

Это сообщение было впервые опубликовано на CodingTheSmartWay.com.

Подпишитесь на YouTube

Вступление

Веб-приложения и мобильные приложения часто требуют внутреннего кода для выполнения таких задач, как отправка уведомлений или обработка длительных задач (например, масштабирование изображений и т. Д.). При традиционном подходе этот внутренний код выполняется на сервере.

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

  • Вам не нужно запускать и поддерживать свой собственный сервер
  • У вас есть изолированная база кода для внутреннего кода
  • Вы получаете счет только за фактическое время выполнения вашего кода.
  • Облачная инфраструктура обладает высокой масштабируемостью

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

Триггеры

Написанные вами функции могут реагировать на события, генерируемые функциями Firebase и Google Cloud. Мы будем называть эти функции триггерами. Прежде чем приступить к разработке наших первых облачных функций, давайте рассмотрим наиболее распространенные триггеры, которые вы можете использовать для облачных функций ниже.

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

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

functions.database.ref('/foo/bar')

Вызывается функция functions.database.re f, и путь к базе данных, в которой мы хотели бы зарегистрироваться, передается в качестве параметра.

Также можно определить часть пути как подстановочный знак, заключив эту часть в фигурные скобки, как вы можете видеть на следующем рисунке:

functions.database.ref('/profiles/{userID}')

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

  • onWrite (): активируется при создании, уничтожении или изменении данных.
  • onCreate (): активируется при создании новых данных
  • onUpdate (): активируется при обновлении данных
  • onDelete (): активируется при удалении данных

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

exports.newUserCreated = functions.database.ref('/messages/{userID}').onCreate(event => { ... });

В этом случае к значению userID можно получить доступ с помощью event.params.userID внутри функции обработчика событий.

Триггеры аутентификации

Используя триггеры аутентификации, вы можете выполнять код в ответ на создание и удаление учетной записи пользователя через Firebase Authentication.

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

exports.newUserCreated = functions.auth.user().onCreate(event => { ... });

Согласно документации Firebase, этот триггер срабатывает в следующих случаях:

  • Пользователь создает учетную запись электронной почты и пароль.
  • Пользователь впервые входит в систему с помощью федеративного поставщика удостоверений.
  • Разработчик создает учетную запись с помощью Firebase Admin SDK.
  • Пользователь впервые входит в новый сеанс анонимной аутентификации.

Событие Cloud Functions не запускается, когда пользователь впервые входит в систему с использованием настраиваемого токена.

Если вы хотите получить дополнительную информацию о профиле пользователя, вы можете использовать объект event.data в методе обработчика событий. Объект event.data имеет тип UserRecord, поэтому вы можете получить доступ к таким свойствам, как displayName (отображаемое имя пользователя) или электронная почта (основной адрес электронной почты пользователя).

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

exports.userDeleted = functions.auth.user().onDelete(event => { ... });

ТРИГГЕРЫ ОБЛАЧНОГО ХРАНИЛИЩА

С помощью триггеров облачного хранилища вы можете инициировать выполнение облачной функции Firebase в ответ на загрузку, обновление или удаление файлов и папок в облачном хранилище Google. Чтобы зарегистрировать функцию-обработчик событий, нам нужно использовать объект functions.storage следующим образом:

exports.storageChanges = functions.storage.object().onChange(event => {...});

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

exports.storageChanges = functions.storage.bucket('bucketName').object().onChange(event => {...});

В функции обработчика событий вы можете использовать различные атрибуты хранилища:

  • event.data: объект хранилища.
  • event.data.bucket: сегмент хранилища, в котором находится файл.
  • event.data.name: путь к файлу в сегменте.
  • event.data.contentType: тип содержимого файла.
  • event.data.resourceState: либо «существует», либо «не_существует». Значение «not_exists» устанавливается, если файл / папка были удалены.
  • event.data.metageneration: сколько раз создавались метаданные файла, для новых объектов начальное значение равно 1.

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

HTTP ТРИГГЕРЫ

Еще один тип триггера, который можно использовать с облачными функциями Firebase, - это триггеры HTTP. Эти триггеры могут быть вызваны через HTTP-запрос и могут быть зарегистрированы с помощью functions.https следующим образом:

exports.httpTest = functions.https.onRequest((req, res) => {...});

Как видите, функция обработчика событий получает два параметра: req и res. Объекты req (которые являются объектом Request из среды Express) предоставляют вам доступ к свойствам исходного HTTP-запроса, отправленного клиентом. Объект res может использоваться для отправки ответа клиенту.

Триггеры аналитики

Используя Google Analytics для Firebase, вы можете подробно понять, как пользователь взаимодействует с вашим приложением для iOS или Android. Поэтому Analytics API предоставляет различные события. События событий преобразования типов можно использовать для регистрации облачных функций следующим образом:

exports.onPurchase = functions.analytics.event('in_app_purchase').onLog(event => {...});

В этом случае мы регистрируем обработчик события конверсии in_app_purchase.

Давай попробуем

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

Установка Firebase CLI

Перед запуском проекта облачных функций нам необходимо убедиться, что установлен клиент командной строки Firebase и что в вашей системе доступна последняя версия. Интерфейс командной строки Firebase доступен в виде пакета NPM. Выполните следующую команду, чтобы установить пакет firebase-tools:

$ npm install -g firebase-tools

Начать новый проект FirebAse Cloud Functions

Установив интерфейс командной строки Firebase на последнем этапе, теперь мы можем войти в Firebase с помощью следующей команды:

$ firebase login

Вы увидите следующий ответ:

Браузер должен открыться и автоматически загрузить URL-адрес, который отображается в консоли. Если у вас уже есть учетная запись Firebase, вы сможете войти в нее. Если вы еще не создали учетную запись Firebase, вам нужно сделать это в первую очередь. После входа в систему вы увидите следующее сообщение:

В то же время логин распознается интерфейсом командной строки Firebase в консоли:

Теперь вы готовы создать новый проект Firebase Cloud Functions. Сначала создайте новую пустую папку проекта:

$ mkdir fb-functions

Затем перейдите во вновь созданную папку:

$ cd fb-functions

и выполните следующую команду:

$ firebase init functions

Вам будет предложено выбрать проект Firebase, который вы хотите использовать для проекта Firebase Cloud Functions. Вы также можете выбрать запись [создать новый проект], если хотите добавить новый проект Firebase в свою учетную запись:

Следующий вопрос, который вам задают: «Хотите ли вы сейчас установить зависимости с npm?». Поскольку мы хотели бы добавить все необходимые зависимости, вам нужно сказать здесь «Y» или просто нажать return, поскольку «Y» является настройкой по умолчанию.

Теперь вы должны увидеть что-то похожее на

Проект Firebase CloudFunctions успешно запущен.

Структура проекта

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

Здесь вы можете увидеть, что структура проекта довольно проста:

  • firebase.json: может содержать настройки для вашего проекта Firebase.
  • functions / package.json: содержит список зависимостей пакета NPM этого проекта.
  • functions / index.js: используется для реализации облачных функций.
  • functions / node_modules: каталог, в котором установлены пакеты NPM, перечисленные в package.json.

Реализация первой облачной функции

Давайте сначала опробуем триггер HTTP. Откройте файл index.js и вставьте следующую реализацию:

const functions = require('firebase-functions');
exports.helloWorld = functions.https.onRequest((req, res) => {
    res.send("Hello from Firebase!");
});

Это самая простая форма реализации облачной функции Firebase на основе триггера HTTP. Сначала нам потребуется ссылка на библиотеку firebase-functions. Облачная функция реализуется путем вызова метода functions.https.onRequest и передачи в качестве первого параметра функции, которая должна быть зарегистрирована для триггера HTTP.

Регистрируемая функция очень проста и состоит из одной строки кода:

res.send("Hello from Firebase!");

Здесь объект Response используется для отправки текстовой строки обратно в браузер, чтобы пользователь получил ответ и мог видеть, что облачная функция работает.

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

$ firebase deploy --only functions

Развертывание запущено, и вы должны получить следующий ответ:

Если развертывание было успешно завершено и вы получили обратно URL-адрес функции, который теперь можно использовать для запуска выполнения облачной функции. Просто скопируйте и вставьте URL-адрес в браузер, и вы должны увидеть следующий результат:

Если вы открываете текущий проект Firebase в серверной части и нажимаете ссылку Функции, вы должны увидеть развернутую функцию helloWorld на панели инструментов:

Вы также можете переключиться на вкладку ЖУРНАЛЫ, чтобы получить подробный вывод журнала:

Другой пример

Давайте реализуем еще один пример, в котором используются две облачные функции Firebase. Первая функция использует триггер HTTP, принимает строку через параметр URL и вставляет эту строку в базу данных Firebase Realtime. Вторая облачная функция использует триггер базы данных в реальном времени и перечисляет изменения, записанные в базу данных первой функцией. Внутри этой функции мы считываем вставленное строковое значение, преобразуем его в верхний регистр и записываем обратно в базу данных.

Начнем с первой функции insertIntoDB. Вставьте следующий код в файл index.js:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.insertIntoDB = functions.https.onRequest((req, res) => {
    const text = req.query.text;
    admin.database().ref('/test').push({text: text}).then(snapshot => {
        res.redirect(303, snapshot.ref);
    })
});

Сначала нам нужно потребовать, чтобы модуль firebase-admin имел возможность записи в базу данных реального времени. Кроме того, нам нужно вызвать метод initializeApp и передать конфигурацию Firebase, которая доступна через functions.config (). Firebase. Реализация облачной функции insertIntoDB выполняется путем повторного использования триггера HTTP путем вызова functions.https.onRequest. Сама функция передается как параметр. Используя объект Request req, мы можем сначала прочитать параметр URL text. Далее мы выполняем

admin.database().ref('/test').push({text: text})

для записи текстовой строки в путь к базе данных / test. Например. если осуществляется доступ к URL-адресу и текст параметра URL-адреса установлен на строку «Моя текстовая строка», новый идентификатор узла добавляется как подузел в / test, а свойство text вставляется как дочерний элемент, как вы можете видеть на следующем рисунке:

Вызов метода push возвращает обещание, поэтому мы можем использовать метод then для выполнения кода после того, как обещание было разрешено (операция с базой данных была выполнена). В этом случае мы используем объект Response для вызова метода redirect для отображения представления консоли базы данных Firebase Realtime в браузере.

Затем давайте реализуем облачную функцию convertToUppercase, которая отслеживает изменения в пути к базе данных / test / {pushId} / text:

exports.convertToUppercase = functions.database.ref('/test/{pushId}/text').onWrite(event => {
    const text = event.data.val();
    const uppercaseText = text.toUpperCase();
    return event.data.ref.parent.child('uppercaseText').set(uppercaseText);
});

В этом случае мы извлекаем значение свойств с помощью event.data.val (). Затем выполняется метод toUpperCase для преобразования строки в верхний регистр, и, наконец, значение верхнего регистра записывается в свойство uppercaseText в том же узле базы данных:

Дальнейшие варианты использования

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

  • Отправлять уведомления пользователям в случае событий
  • Отправить приветственное письмо, когда пользователь зарегистрируется
  • Отправлять подтверждающие электронные письма, когда пользователи подписываются / отказываются от подписки
  • Выполняйте автоматические задачи базы данных в реальном времени, чтобы поддерживать базу данных в актуальном состоянии и чистить
  • Если учетная запись пользователя удалена, удалите также контент пользователя из базы данных.
  • Отслеживайте количество элементов в списке базы данных в реальном времени
  • Выполняйте интенсивные задачи в облаке, а не в приложении
  • Автоматически создавать миниатюры для изображений, загружаемых в облачное хранилище.
  • Рассылка массовых рассылок пользователям
  • Интеграция со сторонними сервисами
  • Перевести текст, вставленный в базу данных в реальном времени, с помощью службы Google Translate.
  • Обработка платежей (например, с помощью Stripe API)

Это сообщение было впервые опубликовано на CodingTheSmartWay.com.

Хотите глубже погрузиться в Angular. Ознакомьтесь со следующими онлайн-курсами:

Онлайн-курс №1: Angular - Полное руководство

Онлайн-курс №2: Угловые - от теории к практике

Онлайн-курс №3: Angular - концепции, код и коллективная мудрость

Отказ от ответственности: это сообщение содержит партнерские ссылки. Это означает, что если вы нажмете на одну из ссылок на продукт, я получу небольшую комиссию. Это поможет поддержать этот блог!