1. Обзор
В этом практическом занятии вы узнаете, как использовать Cloud Functions for Firebase для добавления функциональности в веб-приложение чата, отправляя уведомления пользователям этого приложения.

Что вы узнаете
- Создавайте функции Google Cloud Functions с помощью Firebase SDK.
- Запускайте облачные функции на основе событий аутентификации, облачного хранилища и облачного хранилища Firestore.
- Добавьте поддержку Firebase Cloud Messaging в ваше веб-приложение.
Что вам понадобится
- Кредитная карта. Для работы Cloud Functions for Firebase требуется тарифный план Firebase Blaze, а это значит, что вам нужно будет включить оплату в вашем проекте Firebase с помощью кредитной карты.
- IDE/текстовый редактор на ваш выбор, например WebStorm , Atom или Sublime .
- Терминал для выполнения команд оболочки при установленном NodeJS версии 9.
- Браузер, например, Chrome.
- Пример кода. Подробнее об этом смотрите в следующем шаге.
2. Получите пример кода.
Клонируйте репозиторий GitHub из командной строки:
git clone https://github.com/firebase/friendlychat
Импортируйте стартовое приложение
С помощью вашей IDE откройте или импортируйте файл.
Каталог cloud-functions-start находится в каталоге с примерами кода. Этот каталог содержит начальный код для практического занятия, которое представляет собой полностью функциональное веб-приложение для чата.
3. Создайте проект Firebase и настройте приложение.
Создать проект
- Войдите в консоль Firebase, используя свою учетную запись Google.
- Нажмите кнопку, чтобы создать новый проект, а затем введите название проекта (например,
FriendlyChat). - Нажмите «Продолжить» .
- Если появится запрос, ознакомьтесь с условиями использования Firebase и примите их, после чего нажмите «Продолжить» .
- (Необязательно) Включите помощь ИИ в консоли Firebase (в Firebase она называется "Gemini").
- Для этого практического занятия вам не понадобится Google Analytics, поэтому отключите эту опцию.
- Нажмите «Создать проект» , дождитесь завершения подготовки проекта, а затем нажмите «Продолжить» .
Перейдите на тарифный план Blaze.
Для использования Cloud Functions for Firebase и Cloud Storage for Firebase ваш проект Firebase должен быть подключен к тарифному плану с оплатой по мере использования (Blaze) , то есть он должен быть связан с учетной записью Cloud Billing .
- Для использования учетной записи Cloud Billing требуется способ оплаты, например, кредитная карта.
- Если вы новичок в Firebase и Google Cloud, проверьте, имеете ли вы право на получение кредита в размере 300 долларов США и бесплатной пробной версии учетной записи Cloud Billing .
- Если вы выполняете этот практический семинар в рамках мероприятия, уточните у организатора, есть ли возможность получить облачные кредиты.
Если у вас нет доступа к кредитной карте или вам неудобно продолжать пользоваться тарифным планом Blaze, рассмотрите возможность использования Firebase Emulator Suite , который позволит вам бесплатно эмулировать Cloud Functions на вашем локальном компьютере.
Все проекты Firebase, включая те, что используют тарифный план Blaze, по-прежнему имеют доступ к бесплатным квотам использования Cloud Functions. Шаги, описанные в этом практическом руководстве, будут соответствовать лимитам использования бесплатного уровня. Однако вы будете платить небольшую сумму ( около 0,03 доллара США ) из Cloud Storage, который используется для размещения образов сборки Cloud Functions.
Чтобы перейти на тарифный план Blaze для вашего проекта, выполните следующие шаги:
- В консоли Firebase выберите вариант обновления вашего тарифного плана .
- Выберите тарифный план Blaze. Следуйте инструкциям на экране, чтобы связать учетную запись Cloud Billing с вашим проектом.
Если в рамках этого обновления вам потребовалось создать учетную запись Cloud Billing, возможно, вам нужно будет вернуться к процессу обновления в консоли Firebase, чтобы завершить обновление.
Включить аутентификацию Google
Для авторизации пользователей в приложении мы будем использовать аутентификацию Google, которую необходимо включить.
В консоли Firebase откройте раздел «Сборка» > «Аутентификация» > вкладка «Метод входа» (или перейдите по этой ссылке). Затем включите поставщик авторизации Google и нажмите «Сохранить» . Это позволит пользователям входить в веб-приложение с помощью своих учетных записей Google.
Также вы можете установить для своего приложения общедоступное название Friendly Chat :

Настройка облачного хранилища для Firebase
Приложение использует облачное хранилище для загрузки фотографий.
Вот как настроить Cloud Storage для Firebase в вашем проекте Firebase:
- В левой панели консоли Firebase разверните раздел «Сборка» , а затем выберите «Хранилище» .
- Нажмите « Начать» .
- Выберите местоположение для вашего хранилища по умолчанию.
Для регионовUS-WEST1,US-CENTRAL1иUS-EAST1доступен тариф "Всегда бесплатно" от Google Cloud Storage. Для регионов во всех остальных регионах действуют тарифные планы и правила использования Google Cloud Storage . - Нажмите «Пуск» в тестовом режиме . Ознакомьтесь с отказом от ответственности в отношении правил безопасности.
Не распространяйте и не предоставляйте публичный доступ к приложению без добавления правил безопасности для вашего хранилища. - Нажмите «Создать» .
Добавить веб-приложение
В консоли Firebase добавьте веб-приложение. Для этого перейдите в «Настройки проекта» и прокрутите вниз до пункта «Добавить приложение» . Выберите платформу «web» и установите флажок для настройки Firebase Hosting, затем зарегистрируйте приложение и нажмите «Далее» для выполнения остальных шагов, после чего нажмите « Продолжить в консоль» .
4. Установите интерфейс командной строки Firebase.
Интерфейс командной строки Firebase (CLI) позволит вам локально запустить веб-приложение и развернуть его, а также облачные функции.
Для установки или обновления CLI выполните следующую команду npm:
npm -g install firebase-tools
Чтобы убедиться в правильности установки CLI, откройте консоль и выполните следующую команду:
firebase --version
Убедитесь, что версия Firebase CLI выше 4.0.0 , чтобы в ней были доступны все последние функции, необходимые для Cloud Functions. В противном случае выполните npm install -g firebase-tools для обновления, как показано выше.
Для авторизации Firebase CLI выполните следующую команду:
firebase login
Убедитесь, что вы находитесь в каталоге cloud-functions-start , затем настройте Firebase CLI для использования вашего проекта Firebase:
firebase use --add
Далее выберите идентификатор своего проекта и следуйте инструкциям. При появлении запроса вы можете выбрать любой псевдоним, например, codelab .
5. Разверните и запустите веб-приложение.
Теперь, когда вы импортировали и настроили свой проект, вы готовы запустить веб-приложение в первый раз! Откройте окно терминала, перейдите в папку cloud-functions-start и разверните веб-приложение на хостинге Firebase, используя:
firebase deploy --except functions
Вот что вы должны увидеть в консоли:
i deploying database, storage, hosting
✔ database: rules ready to deploy.
i storage: checking rules for compilation errors...
✔ storage: rules file compiled successfully
i hosting: preparing ./ directory for upload...
✔ hosting: ./ folder uploaded successfully
✔ storage: rules file compiled successfully
✔ hosting: 8 files uploaded successfully
i starting release process (may take several minutes)...
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
Hosting URL: https://friendlychat-1234.firebaseapp.com
Откройте веб-приложение
В последней строке должен отображаться URL-адрес хостинга. Теперь веб-приложение должно запускаться по этому URL-адресу, который должен иметь вид https://<project-id>.firebaseapp.com. Откройте его. Вы должны увидеть работающий пользовательский интерфейс чат-приложения.
Войдите в приложение, используя кнопку «ВОЙТИ ЧЕРЕЗ GOOGLE» , и смело добавляйте сообщения и публикуйте изображения:

Если вы впервые входите в приложение через новый браузер, обязательно разрешите получение уведомлений, когда появится соответствующий запрос: 
Включение уведомлений потребуется позже.
Если вы случайно нажали кнопку «Блокировать» , вы можете изменить эту настройку, нажав на кнопку 🔒 «Защищено» слева от URL-адреса в адресной строке Chrome и переключив ползунок рядом с пунктом «Уведомления» :

Теперь мы добавим некоторые функции, используя Firebase SDK для Cloud Functions.
6. Каталог функций
Cloud Functions позволяет легко запускать код в облаке без необходимости настройки сервера. Мы рассмотрим, как создавать функции, реагирующие на события Firebase Auth, Cloud Storage и базы данных Firebase Firestore. Начнём с аутентификации.
При использовании Firebase SDK для Cloud Functions ваш код Functions будет находиться в каталоге functions (по умолчанию). Ваш код Functions также является приложением Node.js , поэтому ему необходим package.json , содержащий некоторую информацию о вашем приложении и список зависимостей.
Чтобы вам было проще, мы уже создали файл functions/index.js куда будет помещен ваш код. Вы можете ознакомиться с этим файлом, прежде чем продолжить.
cd functions
ls
Если вы не знакомы с Node.js , полезно будет узнать о нем больше, прежде чем продолжить выполнение практического задания.
В файле package.json уже указаны две необходимые зависимости: Firebase SDK для Cloud Functions и Firebase Admin SDK . Чтобы установить их локально, перейдите в папку functions и выполните команду:
npm install
Теперь давайте посмотрим на файл index.js :
index.js
/**
* Copyright 2017 Google Inc. All Rights Reserved.
* ...
*/
// TODO(DEVELOPER): Import the Cloud Functions for Firebase and the Firebase Admin modules here.
// TODO(DEVELOPER): Write the addWelcomeMessage Function here.
// TODO(DEVELOPER): Write the blurImages Function here.
// TODO(DEVELOPER): Write the sendNotification Function here.
Мы импортируем необходимые модули, а затем напишем три функции вместо пунктов TODO. Давайте начнём с импорта необходимых модулей Node.js.
7. Импортируйте модули Cloud Functions и Firebase Admin.
В ходе этого практического занятия потребуются два модуля: firebase-functions , позволяющий записывать триггеры и вести журналы Cloud Functions, и firebase-admin , позволяющий использовать платформу Firebase на сервере с правами администратора для выполнения таких действий, как запись в Cloud Firestore или отправка уведомлений FCM.
В файле index.js замените первую TODO на следующую:
index.js
/**
* Copyright 2017 Google Inc. All Rights Reserved.
* ...
*/
// Import the Firebase SDK for Google Cloud Functions.
const functions = require('firebase-functions');
// Import and initialize the Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp();
// TODO(DEVELOPER): Write the addWelcomeMessage Function here.
// TODO(DEVELOPER): Write the blurImages Function here.
// TODO(DEVELOPER): Write the sendNotification Function here.
SDK Firebase Admin можно настроить автоматически при развертывании в среде Cloud Functions или других контейнерах Google Cloud Platform, и это происходит при вызове метода admin.initializeApp() без аргументов.
Теперь добавим функцию, которая будет запускаться при первом входе пользователя в чат-приложение, и добавим приветственное сообщение в чат.
8. Приветствуем новых пользователей
Структура сообщений чата
Сообщения, отправленные в чат FriendlyChat, хранятся в Cloud Firestore. Давайте посмотрим на структуру данных, используемую для сообщения. Для этого отправьте в чат новое сообщение типа "Hello World":

Должно получиться так:

В консоли Firebase в разделе «Сборка» выберите «База данных Firestore» . Вы должны увидеть коллекцию сообщений и один документ, содержащий написанное вами сообщение:

Как видите, сообщения чата хранятся в Cloud Firestore в виде документа, в коллекцию messages которого добавлены атрибуты name , profilePicUrl , text и timestamp .
Добавление приветственных сообщений
Первая облачная функция добавляет в чат приветственное сообщение для новых пользователей . Для этого можно использовать триггер functions.auth().onCreate , который запускает функцию каждый раз, когда пользователь впервые входит в приложение Firebase. Добавьте функцию addWelcomeMessages в файл index.js :
index.js
// Adds a message that welcomes new users into the chat.
exports.addWelcomeMessages = functions.auth.user().onCreate(async (user) => {
functions.logger.log('A new user signed in for the first time.');
const fullName = user.displayName || 'Anonymous';
// Saves the new welcome message into the database
// which then displays it in the FriendlyChat clients.
await admin.firestore().collection('messages').add({
name: 'Firebase Bot',
profilePicUrl: '/images/firebase-logo.png', // Firebase logo
text: `${fullName} signed in for the first time! Welcome!`,
timestamp: admin.firestore.FieldValue.serverTimestamp(),
});
functions.logger.log('Welcome message written to database.');
});
Добавление этой функции в специальный объект exports — это способ Node сделать функцию доступной за пределами текущего файла, и это необходимо для работы с облачными функциями.
В приведенной выше функции мы добавляем новое приветственное сообщение, отправленное ботом Firebase, в список сообщений чата. Мы делаем это, используя метод add коллекции messages в Cloud Firestore, где хранятся сообщения чата.
Поскольку это асинхронная операция, нам необходимо вернуть Promise , указывающий на завершение записи в Cloud Firestore, чтобы облачные функции не выполнялись слишком рано.
Развертывание облачных функций
Функции Cloud Functions станут активны только после их развертывания. Для этого выполните следующую команду в командной строке:
firebase deploy --only functions
Вот что вы должны увидеть в консоли:
i deploying functions
i functions: ensuring necessary APIs are enabled...
⚠ functions: missing necessary APIs. Enabling now...
i env: ensuring necessary APIs are enabled...
⚠ env: missing necessary APIs. Enabling now...
i functions: waiting for APIs to activate...
i env: waiting for APIs to activate...
✔ env: all necessary APIs are enabled
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (X.XX KB) for uploading
✔ functions: functions folder uploaded successfully
i starting release process (may take several minutes)...
i functions: creating function addWelcomeMessages...
✔ functions[addWelcomeMessages]: Successful create operation.
✔ functions: all functions deployed successfully!
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlypchat-1234/overview
Проверьте функцию
После успешного развертывания функции вам потребуется пользователь, который впервые войдет в систему.
- Откройте приложение в браузере, используя URL-адрес хостинга (в формате
https://<project-id>.firebaseapp.com). - Для первого входа в приложение новым пользователем используйте кнопку «Войти» .
- Если вы уже вошли в приложение, откройте консоль Firebase, раздел «Аутентификация» и удалите свою учетную запись из списка пользователей. Затем войдите снова.

- После входа в систему автоматически отобразится приветственное сообщение:

9. Модерация изображений
Пользователи могут загружать в чат изображения любого типа, и всегда важно модерировать изображения, содержащие оскорбительные элементы, особенно на общедоступных социальных платформах. В FriendlyChat изображения, публикуемые в чате, хранятся в облачном хранилище .
С помощью Cloud Functions вы можете отслеживать новые загрузки изображений, используя триггер functions.storage().onFinalize . Он будет запускаться каждый раз, когда новый файл загружается или изменяется в Cloud Storage.
Для модерации изображений мы будем использовать следующий процесс:
- Проверьте, помечено ли изображение как содержащее материалы для взрослых или содержащее элементы насилия, используя API Cloud Vision .
- Если изображение помечено как проблемное, загрузите его на запущенный экземпляр Functions.
- Размойте изображение с помощью ImageMagick .
- Загрузите размытое изображение в облачное хранилище.
Включите API Cloud Vision
Поскольку в этой функции мы будем использовать API Google Cloud Vision, вам необходимо включить этот API в вашем проекте Firebase. Перейдите по этой ссылке , затем выберите свой проект Firebase и включите API:

Установите зависимости
Для модерации изображений мы будем использовать клиентскую библиотеку Google Cloud Vision для Node.js, @google-cloud/vision , чтобы пропускать изображения через API Cloud Vision и обнаруживать неприемлемые изображения.
Чтобы установить этот пакет в ваше приложение Cloud Functions, выполните следующую команду npm install --save . Убедитесь, что вы делаете это из каталога functions .
npm install --save @google-cloud/vision@2.4.0
Это установит пакет локально и добавит его в качестве объявленной зависимости в ваш файл package.json .
Импортируйте и настройте зависимости.
Чтобы импортировать установленные зависимости и некоторые основные модули Node.js ( path , os и fs ), которые нам понадобятся в этом разделе, добавьте следующие строки в начало файла index.js :
index.js
const Vision = require('@google-cloud/vision');
const vision = new Vision.ImageAnnotatorClient();
const {promisify} = require('util');
const exec = promisify(require('child_process').exec);
const path = require('path');
const os = require('os');
const fs = require('fs');
Поскольку ваша функция будет работать в среде Google Cloud, нет необходимости настраивать библиотеки Cloud Storage и Cloud Vision: они будут настроены автоматически для использования вашего проекта.
Выявление неподходящих изображений
Вы будете использовать триггер Cloud Functions functions.storage.onChange , который запускает ваш код сразу после создания или изменения файла или папки в хранилище Cloud Storage. Добавьте функцию blurOffensiveImages в файл index.js :
index.js
// Checks if uploaded images are flagged as Adult or Violence and if so blurs them.
exports.blurOffensiveImages = functions.runWith({memory: '2GB'}).storage.object().onFinalize(
async (object) => {
const imageUri = `gs://${object.bucket}/${object.name}`;
// Check the image content using the Cloud Vision API.
const batchAnnotateImagesResponse = await vision.safeSearchDetection(imageUri);
const safeSearchResult = batchAnnotateImagesResponse[0].safeSearchAnnotation;
const Likelihood = Vision.protos.google.cloud.vision.v1.Likelihood;
if (Likelihood[safeSearchResult.adult] >= Likelihood.LIKELY ||
Likelihood[safeSearchResult.violence] >= Likelihood.LIKELY) {
functions.logger.log('The image', object.name, 'has been detected as inappropriate.');
return blurImage(object.name);
}
functions.logger.log('The image', object.name, 'has been detected as OK.');
});
Обратите внимание, что мы добавили некоторые параметры конфигурации экземпляра Cloud Functions, который будет запускать функцию. С помощью .runWith({memory: '2GB'}) мы запрашиваем у экземпляра 2 ГБ памяти вместо значения по умолчанию, поскольку эта функция требует больших объемов памяти.
При срабатывании функции изображение обрабатывается API Cloud Vision для определения, помечено ли оно как содержащее материалы для взрослых или содержащее сцены насилия. Если изображение определяется как неприемлемое на основе этих критериев, мы размываем его, что и делается в функции blurImage , как мы увидим далее.
Размытие изображения
Добавьте следующую функцию blurImage в файл index.js :
index.js
// Blurs the given image located in the given bucket using ImageMagick.
async function blurImage(filePath) {
const tempLocalFile = path.join(os.tmpdir(), path.basename(filePath));
const messageId = filePath.split(path.sep)[1];
const bucket = admin.storage().bucket();
// Download file from bucket.
await bucket.file(filePath).download({destination: tempLocalFile});
functions.logger.log('Image has been downloaded to', tempLocalFile);
// Blur the image using ImageMagick.
await exec(`convert "${tempLocalFile}" -channel RGBA -blur 0x24 "${tempLocalFile}"`);
functions.logger.log('Image has been blurred');
// Uploading the Blurred image back into the bucket.
await bucket.upload(tempLocalFile, {destination: filePath});
functions.logger.log('Blurred image has been uploaded to', filePath);
// Deleting the local file to free up disk space.
fs.unlinkSync(tempLocalFile);
functions.logger.log('Deleted local file.');
// Indicate that the message has been moderated.
await admin.firestore().collection('messages').doc(messageId).update({moderated: true});
functions.logger.log('Marked the image as moderated in the database.');
}
В описанной выше функции двоичный файл изображения загружается из облачного хранилища. Затем изображение размывается с помощью инструмента convert ImageMagick, и размытая версия повторно загружается в хранилище. Далее мы удаляем файл в экземпляре Cloud Functions, чтобы освободить место на диске, поскольку один и тот же экземпляр Cloud Functions может использоваться повторно, и если файлы не будут очищены, может закончиться место на диске. Наконец, мы добавляем логическое значение в сообщение чата, указывающее на то, что изображение было модерировано, и это запустит обновление сообщения на стороне клиента.
Разверните функцию
Функция станет активной только после её развертывания. В командной строке выполните команду ` firebase deploy --only functions :`.
firebase deploy --only functions
Вот что вы должны увидеть в консоли:
i deploying functions
i functions: ensuring necessary APIs are enabled...
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (X.XX KB) for uploading
✔ functions: functions folder uploaded successfully
i starting release process (may take several minutes)...
i functions: updating function addWelcomeMessages...
i functions: creating function blurOffensiveImages...
✔ functions[addWelcomeMessages]: Successful update operation.
✔ functions[blurOffensiveImages]: Successful create operation.
✔ functions: all functions deployed successfully!
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
Проверьте функцию
После успешного развертывания функции:
- Откройте приложение в браузере, используя URL-адрес хостинга (в формате
https://<project-id>.firebaseapp.com). - После входа в приложение загрузите изображение:

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

10. Уведомления о новых сообщениях
В этом разделе вы добавите облачную функцию, которая будет отправлять уведомления участникам чата при публикации нового сообщения.
Используя Firebase Cloud Messaging (FCM), вы можете надежно отправлять уведомления пользователям на разных платформах. Для отправки уведомления пользователю необходим токен его устройства FCM. Веб-приложение чата, которое мы используем, уже собирает токены устройств пользователей при первом открытии приложения в новом браузере или на новом устройстве. Эти токены хранятся в Cloud Firestore в коллекции fcmTokens .
Если вы хотите узнать, как получать токены устройств FCM в веб-приложении, вы можете пройти обучающий курс Firebase Web Codelab .
Отправить уведомления
Для отслеживания появления новых сообщений используйте триггер Cloud Functions functions.firestore.document().onCreate , который запускает ваш код при создании нового объекта по заданному пути в Cloud Firestore. Добавьте функцию sendNotifications в файл index.js :
index.js
// Sends a notifications to all users when a new message is posted.
exports.sendNotifications = functions.firestore.document('messages/{messageId}').onCreate(
async (snapshot) => {
// Notification details.
const text = snapshot.data().text;
const payload = {
notification: {
title: `${snapshot.data().name} posted ${text ? 'a message' : 'an image'}`,
body: text ? (text.length <= 100 ? text : text.substring(0, 97) + '...') : '',
icon: snapshot.data().profilePicUrl || '/images/profile_placeholder.png',
click_action: `https://${process.env.GCLOUD_PROJECT}.firebaseapp.com`,
}
};
// Get the list of device tokens.
const allTokens = await admin.firestore().collection('fcmTokens').get();
const tokens = [];
allTokens.forEach((tokenDoc) => {
tokens.push(tokenDoc.id);
});
if (tokens.length > 0) {
// Send notifications to all tokens.
const response = await admin.messaging().sendToDevice(tokens, payload);
await cleanupTokens(response, tokens);
functions.logger.log('Notifications have been sent and tokens cleaned up.');
}
});
В приведенной выше функции мы собираем все токены устройств пользователей из базы данных Cloud Firestore и отправляем уведомление каждому из них, используя функцию admin.messaging().sendToDevice .
Очистка токенов
Наконец, нам нужно удалить токены, которые больше недействительны. Это происходит, когда токен, полученный от пользователя, больше не используется браузером или устройством. Например, это может произойти, если пользователь отозвал разрешение на получение уведомлений для сессии браузера. Для этого добавьте следующую функцию cleanupTokens в файл index.js :
index.js
// Cleans up the tokens that are no longer valid.
function cleanupTokens(response, tokens) {
// For each notification we check if there was an error.
const tokensDelete = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
functions.logger.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens that are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
const deleteTask = admin.firestore().collection('fcmTokens').doc(tokens[index]).delete();
tokensDelete.push(deleteTask);
}
}
});
return Promise.all(tokensDelete);
}
Разверните функцию
Функция станет активной только после её развертывания. Для развертывания выполните следующую команду в командной строке:
firebase deploy --only functions
Вот что вы должны увидеть в консоли:
i deploying functions
i functions: ensuring necessary APIs are enabled...
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (X.XX KB) for uploading
✔ functions: functions folder uploaded successfully
i starting release process (may take several minutes)...
i functions: updating function addWelcomeMessages...
i functions: updating function blurOffensiveImages...
i functions: creating function sendNotifications...
✔ functions[addWelcomeMessages]: Successful update operation.
✔ functions[blurOffensiveImages]: Successful updating operation.
✔ functions[sendNotifications]: Successful create operation.
✔ functions: all functions deployed successfully!
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
Проверьте функцию
- После успешного развертывания функции откройте приложение в браузере, используя URL-адрес хостинга (в формате
https://<project-id>.firebaseapp.com). - Если вы впервые входите в приложение, обязательно разрешите получение уведомлений, когда появится соответствующий запрос:

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

11. Поздравляем!
Вы использовали Firebase SDK для Cloud Functions и добавили серверные компоненты в приложение чата.
Что мы рассмотрели
- Создание облачных функций с использованием Firebase SDK для облачных функций.
- Запускайте облачные функции на основе событий аутентификации, облачного хранилища и облачного хранилища Firestore.
- Добавьте поддержку Firebase Cloud Messaging в ваше веб-приложение.
- Развертывайте облачные функции с помощью Firebase CLI.
Следующие шаги
- Узнайте о других типах триггеров Cloud Function .
- Используйте Firebase и Cloud Functions в своем приложении.