Бессерверное выполнение кода бэкенда
Разработчики могут развертывать функции на JavaScript или TypeScript в ответ на события, инициированные функциями Firebase или HTTPS-запросами. Эта бессерверная модель устраняет необходимость в предоставлении или управлении серверами, обеспечивая более стройный процесс разработки.
Установка
Этот раздел поможет вам пройти процесс настройки. Если вам нужны более подробные объяснения каждого шага, обратитесь к официальной документации Firebase.
Создание проекта Firebase
- Перейдите в консоль Firebase и нажмите Добавить проект.
- Если появится запрос, просмотрите и примите условия Firebase.
- Нажмите Продолжить.
- Решите, хотите ли вы делиться аналитикой или нет.
- Нажмите Создать проект.
- Включите Functions (необходим платный план)
Создание функции Firebase на локальной машине и загрузка на сервер Firebase
Для создания Functions используем терминал в macOC.
Чтобы написать функции и развернуть их в среде выполнения Firebase Functions, вам нужно настроить среду Node.js и установить Firebase CLI (Это инструмент командной строки, который позволяет взаимодействовать с Firebase из терминала).
Устанавливать Firebase CLI будем в локальную папку, поэтому первым делом создадим папку для проекта:
mkdir my-frb-project
Перейдем в созданную папку :
cd /Users/ХХХХХХХХ/my-frb-project
Инициализируем файл package.json :
npm init -y
Устанавливаем Firebase CLI. в папке проекта паявиться папка “node_modules”:
npm i firebase-tools -D
Проверяем версию Firebase CLI :
npx firebase-tools --version
Логинимся к своему аккаунту firebase : (может потребоватся разлогинится npx firebase-tools logout)
npx firebase-tools login
Инициализируем Firebase CLI В процессе инициализации выбираем нужный проект firebase. При вопросе “Do you want to use ESLint to catch probable bugs and enforce style?” НУЖНО ответить “НЕТ” из-за “ESLint” крашится загрузка функции на фарбейз
npx firebase init functions
Проект создан теперь переходим в VSCode для написания и тестирования функции
В vs-code открываем папку проекта (не файл а именно папку). Наш код будет располагаться в файле index.ts. (или index.js если выбрали js проект при создании).
Вместо системного терминала будем использовать терминал vs-code.
Переходим в папку “functions”
cd /Users/ХХХХХХХХ/my-frb-project/functions
В файле index.ts (или index.js если выбрали js ) пишем наш код.
в данном случае пишем функции Firebase (JavaScript), которая возвращает IP-адрес клиента (Unity-программы), отправляющего HTTP-запрос.
const functions = require("firebase-functions");
// Простая HTTP-функция
exports.getClientIp = functions.https.onRequest((req, res) => {
// Получаем IP-адрес из заголовков или сокета
const ip = req.headers['x-forwarded-for']?.split(',')[0] || req.connection.remoteAddress;
console.log("Client IP:", ip);
res.status(200).json({ ip });
});
Для теста, чтоб запустить Firebase Emulator Suite нужно выполнить команду из Firebase CLI
Только Eсли вы пишете на TS: чтоб упростить эту задачу нужно в файл functions/package.json добавить
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint --ext .js,.ts .", // новое
"build": "tsc", // новое
"build:watch": "tsc --watch", // новое
"serve": "firebase emulators:start --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "22"
},
"main": "index.js",
"dependencies": {
"firebase-admin": "^12.6.0",
"firebase-functions": "^6.0.1"
},
"devDependencies": {
"firebase-functions-test": "^3.1.0"
},
"private": true
}
Теперь можно перекомпилировать проект и запустить эмулятор командой:
npm run build:watch
Eсли вы пишете на JS: предыдущий пункт (перекомпилирование ) пропускаем
Открываем еще одно окно терминала:
npm run serve
Это запустит эмулятор и распечатает url адрес для тестирования в терминале.
**********-macbook functions % npm run serve
> serve
> firebase emulators:start --only functions
i emulators: Starting emulators: functions
⚠ functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: apphosting, auth, firestore, database, hosting, pubsub, storage, dataconnect
i functions: Watching "**********/functions" for Cloud Functions...
⚠ functions: Your requested "node" version "22" doesn't match your global version "20". Using node@20 from host.
Serving at port 8390
✔ functions: Loaded functions definitions from source: getClientIp.
✔ functions[us-central1-getClientIp]: http function initialized (http://127.0.0.1:5001/**********/us-central1/getClientIp).
┌─────────────────────────────────────────────────────────────┐
│ ✔ All emulators ready! It is now safe to connect your app. │
│ i View Emulator UI at http://127.0.0.1:4000/ │
└─────────────────────────────────────────────────────────────┘
┌───────────┬────────────────┬─────────────────────────────────┐
│ Emulator │ Host:Port │ View in Emulator UI │
├───────────┼────────────────┼─────────────────────────────────┤
│ Functions │ 127.0.0.1:5001 │ http://127.0.0.1:4000/functions │
└───────────┴────────────────┴─────────────────────────────────┘
Emulator Hub host: 127.0.0.1 port: 4400
Other reserved ports: 4500
Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.
i functions: Beginning execution of "us-central1-getClientIp"
> Client IP: undefined
i functions: Finished "us-central1-getClientIp" in 8.162809ms
Запускаем полученный в браузере адрес http://127.0.0.1:5001/**/us-central1/getClientIp и видим выполнение функции.
Залить функцию на сарвер:
npm run deploy
Дополнительно:
https://grammy.dev/ru/hosting/firebase