Функции облака
Функции облака позволяют запускать бэкенд-код в ответ на события, вызванные функциями Firebase и HTTPS-запросами. Например, вы хотите автоматически отправлять приветственное письмо пользователям при регистрации в вашем приложении. Вы можете сделать это, используя функцию облака, которая срабатывает при событии создания пользователя аутентификации Firebase.
Мы позволяем вам писать и развертывать функции облака Firebase непосредственно в платформе. С интегрированным редактором кода написание функций облака на JavaScript происходит быстро и удобно для пользователя. Каждая функция имеет настраиваемые настройки заготовки, включая предварительно настроенные основные параметры, такие как память, регион и время ожидания.
Ознакомьтесь с некоторыми интересными примерами использования функций облака.
Добавление функций облака
Давайте посмотрим, как добавить функцию облака, создав пример, который генерирует логотипы на основе запросов пользователя. Вот как это выглядит:
Функция облака получает ввод о т виджета TextField и инициирует вызов API к API генерации изображений. После получения URL изображения отображается в виджете Image.
Вот пошаговая инструкция по созданию такого примера:
- Добавьте переменные состояния страницы
- Создайте страницу
- Создайте и разверните функцию облака
- Дополнительно: Добавление пакета
- Запуск функции облака
- Дополнительно: Использование результатов функции облака
- Убедитесь, что проект находится на тарифном плане Blaze в Firebase.
- Завершите все шаги в Настройке Firebase.
1. Добавление переменных состояния страницы
Для этого примера вам нужно настроить две переменные состояния страницы:
- generatingImage (Тип: Boolean): Используется для управления видимостью индикатора загрузки во время процесса создания логотипа. Его значение устанавливается на True перед инициированием вызова API и переключается на False, когда создание логотипа завершено.
- logoImage (Тип: ImagePath): Используется для хранения сгенерированного изображения логотипа. После успешного вызова API URL полученного изображения хранится здесь, что позволяет отображать логотип в виджете Image.
2. Создание страницы
Добавьте страницу, позволяющую пользователям вводить подсказку. Для ускорения этого процесса можно добавить страницу из шаблона или использовать AI Page Gen. Вот страница, добавленная с использованием AI Page Gen, и после некоторых модификаций она выглядит следующим образом:
Также посмотрите, как строить макет страницы, если вы хотите создать страницу с нуля.
Несколько замечаний:
- Мы используем виджет ConditionalBuilder, чтобы показывать/скрывать индикатор загрузки на основе переменной generatingImage. Подсказка: Блок Else этого виджета представляет собой индикатор выполнения внутри контейнера с анимацией вращающегося цикла.
- Виджет Image использует переменную logoImage для отображения логотипа.
3. Создание и развертывание функции облака
Для создания и развертывания функции облака:
- Нажмите на Функции облака в Меню навигации (слева от вашего экрана).
- Нажмите на + Добавить. Это добавит стандартную
newCloudFunction
. - Установите Название функции облака.
Настройки заготовки
Справа можно настроить следующие настройки заготовки:
-
Выделение памяти: Вы можете указать количество памяти, которую должна иметь ваша функция при выполнении в зависимости от ее сложности и потребностей. Эта настройка важна, поскольку она влияет на производительность функции и стоимость ее выполнения. Больше памяти может улучшить производительность для интенсивных задач, но также увеличивает затраты.
-
Время ожидания (с): Это максимальное количество времени, в секундах, в течение которого функция может выполняться до автоматического завершения. Если вашей функции требуется больше времени для выполнения, возможно, потребуется увеличить настройку времени ожидания. Однако помните, что у величение времени ожидания может повлечь за собой дополнительные затраты, так как тарификация происходит на основе времени выполнения.
-
Требуется аутентификация: Включите эту настройку, если вы хотите, чтобы пользователи были аутентифицированы для выполнения этой функции облака.
-
Регион функции облака: Это определяет географическое расположение серверов, где развертываются и выполняются ваши функции. Идеально было бы сохранить это же, что и Местоположение ресурсов GCP по умолчанию и регион функции облака, указанный в дополнительных настройках Firebase.
Настройка ввода и вывода
Ваша функция облака может требовать некоторые данные для обработки и возврата результата. Вы можете сделать это, настроив ввод и вывод.
-
Для получения вывода из функции Cloud Function активируйте Вернуть значение и выберите соответствующий тип вывода, например 'String' для текста. Для этого примера установите ImagePath, чтобы получить URL сгенерированного логотипа.
-
Для ввода данных: Щелкните + Добавить параметры. Назовите параметр, выберите его Тип, выберите один или несколько элементов (Опция Является ли списком), и уберите галочку Может быть нулевым, если значение может быть равно null. Для этого примера добавьте параметр 'prompt' с Типом 'String'.
-
При использовании Пользовательских типов данных, Cloud Function ожидает JSON, сопоставляющий каждое поле типа данных с парой ключ-значение в JSON. Если тип данных является списком, функция ожидает список JSON. Например, для пользовательского типа данных с именем 'Person' с полями 'Name' и 'Age' функция должна вернуть:
//JSON:
{ "Name": "John", "Age": 30 }
//Пример кода функции облака:
return {
"name": person.name,
"age": person.age
};
Для списка функция должна вернуть:
//JSON
[ { "Name": "John", "Age": 30 }, { "Name": "Jane", "Age": 25 } ]
//Пример кода функции облака:
return filteredpersons.map(filteredpersons => {
return {
"name": filteredpersons.name,
"age": filteredpersons.age
};
});
Для развертывания
-
Нажмите на
[</>]
, чтобы увидеть заготовочный код; откроется всплывающее окно с обновленным кодом, а затем нажмите</> Копировать в редактор
. Подсказка: Чтобы убедиться, что вы можете развернуть функцию облака (перед добавлением собственного кода), перейдите непосредственно к шагам 8 и 9. -
В редакторе кода добавьте код функции облака. Подсказка: Вы можете скопировать заготовочный код в ChatGPT и попросить его написать желаемый код на его основе.
-
Нажмите Сохранить функцию облака.
-
Нажмите Развернуть.
Вот код, используемый для этого примера:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const https = require('https');
exports.logoMaker = functions.region('us-central1')
.runWith({
timeoutSeconds: 10,
memory: '512MB'
}).https.onCall((data, context) => {
return new Promise((resolve, reject) => {
const prompt = data.prompt;
if (!prompt) {
reject(new functions.https.HttpsError('invalid-argument', 'No prompt provided'));
return;
}
const postData = JSON.stringify({
model: "dall-e-3",
prompt: prompt,
n: 1,
size: "1024x1024"
});
const options = {
hostname: 'api.openai.com',
port: 443,
path: '/v1/images/generations',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer YOUR-APIKEY`,
'Content-Length': postData.length
}
};
const req = https.request(options, (res) => {
let responseBody = '';
res.on('data', (chunk) => {
responseBody += chunk;
});
res.on('end', () => {
try {
const responseJSON = JSON.parse(responseBody);
if (responseJSON.data && responseJSON.data.length > 0) {
// Retrieve the URL of the first image
const firstImageUrl = responseJSON.data[0].url;
resolve(firstImageUrl);
} else {
reject(new functions.https.HttpsError('not-found', 'No images found'));
}
} catch (error) {
reject(new functions.https.HttpsError('internal', 'Error processing response', error));
}
});
});
req.on('error', (error) => {
reject(new functions.https.HttpsError('internal', 'Error generating image', error));
});
req.write(postData);
req.end();
});
});
Всегда создавайте и используйте обновленный заготовочный код или корректируйте собственный код соответственно при изменениях в коде, настройках заготовки или параметрах ввода/вывода.
4. Дополнительно: Добавление пакета
Вашей функции облака может потребоваться работа с сторонними пакетами. Вы можете включить любой пакет npm (зависимость), перечислив его в файле package.json
. Этот файл не только управляет зависимостями пакетов npm для ваших функций, но и содержит метаданные проекта, настраивает скрипты для задач, таких как развертывание, и определяет совместимые версии Node.js.
Чтобы добавить зависимость, откройте файл package.json
и укажите ваш пакет в разделе dependencies
.
5. Запуск функции облака
Новая созданная функция облака будет доступна как действие при добавлении. Для этого примера по щелчку кнопки мы сначала устанавливаем generatingImage на True, а затем запускаем Действие функции облака.