Cloud Functions'ı kullanmaya başlamak için bu eğitime göz atın. Eğitimde, gerekli kurulum görevleriyle başlayıp iki ilgili işlevin oluşturulması, test edilmesi ve dağıtılması anlatılıyor:
- Bir metin değerini kabul eden ve bunu Cloud Firestore öğesine yazan bir URL'yi kullanıma sunan "mesaj ekle" işlevi.
- Cloud Firestore yazma işleminde tetiklenen ve metni büyük harfe dönüştüren bir "büyük harf yap" işlevi.
İşlevleri içeren tam örnek kodu aşağıda bulabilirsiniz:
Node.js
// The Cloud Functions for Firebase SDK to create Cloud Functions and triggers.
const {logger} = require("firebase-functions");
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
// The Firebase Admin SDK to access Firestore.
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");
initializeApp();
// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addmessage = onRequest(async (req, res) => {
// Grab the text parameter.
const original = req.query.text;
// Push the new message into Firestore using the Firebase Admin SDK.
const writeResult = await getFirestore()
.collection("messages")
.add({original: original});
// Send back a message that we've successfully written the message
res.json({result: `Message with ID: ${writeResult.id} added.`});
});
// Listens for new messages added to /messages/:documentId/original
// and saves an uppercased version of the message
// to /messages/:documentId/uppercase
exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => {
// Grab the current value of what was written to Firestore.
const original = event.data.data().original;
// Access the parameter `{documentId}` with `event.params`
logger.log("Uppercasing", event.params.documentId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing
// asynchronous tasks inside a function
// such as writing to Firestore.
// Setting an 'uppercase' field in Firestore document returns a Promise.
return event.data.ref.set({uppercase}, {merge: true});
});
Python
# The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
from firebase_functions import firestore_fn, https_fn
# The Firebase Admin SDK to access Cloud Firestore.
from firebase_admin import initialize_app, firestore
import google.cloud.firestore
app = initialize_app()
@https_fn.on_request()
def addmessage(req: https_fn.Request) -> https_fn.Response:
"""Take the text parameter passed to this HTTP endpoint and insert it into
a new document in the messages collection."""
# Grab the text parameter.
original = req.args.get("text")
if original is None:
return https_fn.Response("No text parameter provided", status=400)
firestore_client: google.cloud.firestore.Client = firestore.client()
# Push the new message into Cloud Firestore using the Firebase Admin SDK.
_, doc_ref = firestore_client.collection("messages").add({"original": original})
# Send back a message that we've successfully written the message
return https_fn.Response(f"Message with ID {doc_ref.id} added.")
@firestore_fn.on_document_created(document="messages/{pushId}")
def makeuppercase(event: firestore_fn.Event[firestore_fn.DocumentSnapshot | None]) -> None:
"""Listens for new documents to be added to /messages. If the document has
an "original" field, creates an "uppercase" field containg the contents of
"original" in upper case."""
# Get the value of "original" if it exists.
if event.data is None:
return
try:
original = event.data.get("original")
except KeyError:
# No "original" field, so do nothing.
return
# Set the "uppercase" field.
print(f"Uppercasing {event.params['pushId']}: {original}")
upper = original.upper()
event.data.reference.update({"uppercase": upper})
Bu eğitim hakkında
Bu örnekte Cloud Firestore ve HTTP tetikli işlevleri seçmemizin nedenlerinden biri, bu arka plan tetikleyicilerinin Firebase Local Emulator Suite aracılığıyla kapsamlı bir şekilde test edilebilmesidir. Bu araç seti Realtime Database, Cloud Storage, PubSub, Auth ve HTTP ile çağrılabilen tetikleyicileri de destekler. Remote Config ve TestLab tetikleyicileri gibi diğer arka plan tetikleyici türleri, bu sayfada açıklanmayan araç setleri kullanılarak etkileşimli olarak test edilebilir.
Bu eğitimin aşağıdaki bölümlerinde, örneği oluşturmak, test etmek ve dağıtmak için gereken adımlar ayrıntılı olarak açıklanmaktadır.
Firebase projesi oluşturma
Firebase veya Cloud'da yeniyseniz
Firebase veya Google Cloud'i yeni kullanmaya başladıysanız aşağıdaki adımları uygulayın.
Tamamen yeni bir Firebase projesi (ve temelindeki Google Cloud projesi) oluşturmak istiyorsanız da bu adımları uygulayabilirsiniz.
- Firebase konsolunda oturum açın.
- Yeni bir Firebase projesi oluşturmak için düğmeyi tıklayın.
-
Metin alanına bir proje adı girin.
Google Cloud kuruluşunun bir parçasıysanız projenizi hangi klasörde oluşturacağınızı isteğe bağlı olarak seçebilirsiniz.
- İstenirse Firebase şartlarını inceleyip kabul edin ve Devam'ı tıklayın.
- (İsteğe bağlı) Firebase konsolunda yapay zeka yardımını etkinleştirin ("Firebase'de Gemini" olarak adlandırılır). Bu özellik, geliştirme sürecinizi basitleştirmenize ve başlamanıza yardımcı olabilir.
-
(İsteğe bağlı) Projeniz için Google Analytics'ı ayarlayın. Bu sayede, aşağıdaki Firebase ürünlerini kullanarak optimum bir deneyim elde edebilirsiniz: Firebase A/B Testing, Cloud Messaging, Crashlytics, In-App Messaging ve Remote Config (kişiselleştirme dahil).
Mevcut bir Google Analytics hesabı seçin veya yeni bir hesap oluşturun. Yeni bir hesap oluşturursanız Analytics raporlama konumunuzu seçin, ardından projeniz için veri paylaşım ayarlarını ve Google Analytics şartlarını kabul edin.
- Proje oluştur'u tıklayın.
Firebase, projenizi oluşturur, bazı başlangıç kaynaklarını sağlar ve önemli API'leri etkinleştirir. İşlem tamamlandığında Firebase konsolunda Firebase projenizin genel bakış sayfasına yönlendirilirsiniz.
Mevcut Cloud projesi
Firebase'i mevcut bir Google Cloud projesiyle kullanmaya başlamak istiyorsanız aşağıdaki adımları uygulayın. "Firebase'i mevcut bir Google Cloud projesine ekleme" hakkında daha fazla bilgi edinin.
- Mevcut Google Cloud projesine erişmenizi sağlayan hesapla Firebase konsolunda oturum açın.
- Yeni bir Firebase projesi oluşturmak için düğmeyi tıklayın.
- Sayfanın alt kısmında Firebase'i Google Cloud projesine ekle'yi tıklayın.
- Metin alanına mevcut projenin proje adını girmeye başlayın ve ardından görüntülenen listeden projeyi seçin.
- Projeyi aç'ı tıklayın.
- İstenirse Firebase şartlarını inceleyip kabul edin ve Devam'ı tıklayın.
- (İsteğe bağlı) Firebase konsolunda yapay zeka yardımını etkinleştirin ("Firebase'de Gemini" olarak adlandırılır). Bu özellik, geliştirme sürecinizi basitleştirmenize ve başlamanıza yardımcı olabilir.
-
(İsteğe bağlı) Projeniz için Google Analytics'ı ayarlayın. Bu sayede, aşağıdaki Firebase ürünlerini kullanarak optimum bir deneyim elde edebilirsiniz: Firebase A/B Testing, Cloud Messaging, Crashlytics, In-App Messaging ve Remote Config (kişiselleştirme dahil).
Mevcut bir Google Analytics hesabı seçin veya yeni bir hesap oluşturun. Yeni bir hesap oluşturursanız Analytics raporlama konumunuzu seçin, ardından projeniz için veri paylaşım ayarlarını ve Google Analytics şartlarını kabul edin.
- Firebase ekle'yi tıklayın.
Firebase Firebase'i mevcut projenize ekler. İşlem tamamlandığında Firebase konsolunda Firebase projenizin genel bakış sayfasına yönlendirilirsiniz.
Ortamınızı ve Firebase CLI'yı ayarlama
Node.js
İşlev yazmak için Node.js ortamına, işlevleri Cloud Functions çalışma zamanına dağıtmak için ise Firebase CLI'ya ihtiyacınız vardır. Node.js ve npm'yi yüklemek için Node Version Manager önerilir.
Node.js ve npm'yi yükledikten sonra, tercih ettiğiniz yöntemi kullanarak Firebase CLI'yı yükleyin. CLI'yı npm aracılığıyla yüklemek için şunu kullanın:
npm install -g firebase-tools
Bu komut, tüm dünyada kullanılabilen firebase komutunu yükler. Komut başarısız olursa npm izinlerini değiştirmeniz gerekebilir.
firebase-tools
uygulamasının en son sürümüne güncellemek için aynı komutu tekrar çalıştırın.
Python
İşlev yazmak için Python ortamına, işlevleri Cloud Functions çalışma zamanına dağıtmak için Firebase CLI'ya ihtiyacınız vardır. Bağımlılıkları ayırmak için venv
kullanmanızı öneririz. 3.10-3.13 arasındaki Python sürümleri desteklenir. Varsayılan çalışma zamanı 3.13'tür.
Python'u yükledikten sonra, tercih ettiğiniz yöntemi kullanarak Firebase CLI'yı yükleyin.
Projenizi ilk kullanıma hazırlayın
Firebase SDK'sını Cloud Functions için başlattığınızda, bağımlılıklar ve bazı minimum örnek kodlar içeren boş bir proje oluşturursunuz. Node.js kullanıyorsanız işlevleri oluşturmak için TypeScript veya JavaScript'i seçebilirsiniz. Bu eğitimin amaçları doğrultusunda Cloud Firestore öğesini de başlatmanız gerekir.
Projenizi başlatmak için:
- Tarayıcı üzerinden giriş yapmak ve Firebase CLI'nın kimliğini doğrulamak için
firebase login
komutunu çalıştırın. - Firebase proje dizininize gidin.
- Koşu
firebase init firestore
. Bu eğitimde, Firestore kuralları ve dizin dosyaları istendiğinde varsayılan değerleri kabul edebilirsiniz. Bu projede henüz Cloud Firestore kullanmadıysanız Cloud Firestore ile çalışmaya başlama başlıklı makalede açıklandığı gibi Firestore için bir başlangıç modu ve konumu da seçmeniz gerekir. - Koşu
firebase init functions
. CLI, mevcut bir kod tabanı seçmenizi veya yeni bir kod tabanı başlatıp adlandırmanızı ister. Başlangıç aşamasında varsayılan konumdaki tek bir kod tabanı yeterlidir. Daha sonra, uygulamanız genişledikçe kod tabanlarındaki işlevleri düzenlemek isteyebilirsiniz. CLI, dil desteği için aşağıdaki seçenekleri sunar:
- JavaScript
- TypeScript
- Python
Bu eğitim için JavaScript veya Python'ı seçin. TypeScript'te yazma işlemi için TypeScript ile İşlev Yazma başlıklı makaleyi inceleyin.
CLI, bağımlılıkları yükleme seçeneği sunar. Bağımlılıkları başka bir şekilde yönetmek istiyorsanız bu isteği güvenle reddedebilirsiniz.
Bu komutlar başarıyla tamamlandıktan sonra proje yapınız şu şekilde görünür:
Node.js
myproject
+- .firebaserc # Hidden file that helps you quickly switch between
| # projects with `firebase use`
|
+- firebase.json # Describes properties for your project
|
+- functions/ # Directory containing all your functions code
|
+- .eslintrc.json # Optional file containing rules for JavaScript linting.
|
+- package.json # npm package file describing your Cloud Functions code
|
+- index.js # Main source file for your Cloud Functions code
|
+- node_modules/ # Directory where your dependencies (declared in
# package.json) are installed
Node.js için başlatma sırasında oluşturulan package.json
dosyası önemli bir anahtar içerir: "engines": {"node": "18"}
. Bu, işlevleri yazmak ve dağıtmak için Node.js sürümünüzü belirtir. Desteklenen diğer sürümleri seçebilirsiniz.
Python
myproject
+- .firebaserc # Hidden file that helps you quickly switch between
| # projects with `firebase use`
|
+- firebase.json # Describes properties for your project
|
+- functions/ # Directory containing all your functions code
|
+- main.py # Main source file for your Cloud Functions code
|
+- requirements.txt # List of the project's modules and packages
|
+- venv/ # Directory where your dependencies are installed
Gerekli modülleri içe aktarın ve bir uygulamayı başlatın
Kurulum görevlerini tamamladıktan sonra kaynak dizini açabilir ve aşağıdaki bölümlerde açıklandığı gibi kod eklemeye başlayabilirsiniz. Bu örnek için projenizin Cloud Functions ve Admin SDK modüllerini içe aktarması gerekir. Kaynak dosyanıza aşağıdaki gibi satırlar ekleyin:
Node.js
// The Cloud Functions for Firebase SDK to create Cloud Functions and triggers.
const {logger} = require("firebase-functions");
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
// The Firebase Admin SDK to access Firestore.
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");
initializeApp();
Python
# The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
from firebase_functions import firestore_fn, https_fn
# The Firebase Admin SDK to access Cloud Firestore.
from firebase_admin import initialize_app, firestore
import google.cloud.firestore
app = initialize_app()
Bu satırlar, gerekli modülleri yükler ve admin
uygulama örneğini başlatır. Bu örnekte Cloud Firestore değişiklikler yapılabilir.
Admin SDK'nın desteklendiği her yerde (FCM, Authentication ve Firebase Realtime Database için olduğu gibi) Cloud Functions kullanarak Firebase'i entegre etmenin güçlü bir yolunu sunar.
Firebase CLI, projenizi başlattığınızda Firebase Admin SDK'sını ve Firebase Cloud Functions modülleri için SDK'yı otomatik olarak yükler. Projenize üçüncü taraf kitaplıkları ekleme hakkında daha fazla bilgi için Bağımlılıkları İşleme başlıklı makaleyi inceleyin.
"Mesaj ekle" işlevini ekleyin
"Mesaj ekle" işlevi için kaynak dosyanıza şu satırları ekleyin:
Node.js
// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addmessage = onRequest(async (req, res) => {
// Grab the text parameter.
const original = req.query.text;
// Push the new message into Firestore using the Firebase Admin SDK.
const writeResult = await getFirestore()
.collection("messages")
.add({original: original});
// Send back a message that we've successfully written the message
res.json({result: `Message with ID: ${writeResult.id} added.`});
});
Python
@https_fn.on_request()
def addmessage(req: https_fn.Request) -> https_fn.Response:
"""Take the text parameter passed to this HTTP endpoint and insert it into
a new document in the messages collection."""
# Grab the text parameter.
original = req.args.get("text")
if original is None:
return https_fn.Response("No text parameter provided", status=400)
firestore_client: google.cloud.firestore.Client = firestore.client()
# Push the new message into Cloud Firestore using the Firebase Admin SDK.
_, doc_ref = firestore_client.collection("messages").add({"original": original})
# Send back a message that we've successfully written the message
return https_fn.Response(f"Message with ID {doc_ref.id} added.")
"Mesaj ekle" işlevi bir HTTP uç noktasıdır. Uç noktaya yapılan tüm istekler, platformunuzun istek işleyicisine (onRequest()
veya on_request
) iletilen istek ve yanıt nesneleriyle sonuçlanır.
HTTP işlevleri eşzamanlıdır (çağrılabilir işlevlere benzer). Bu nedenle, yanıtı mümkün olduğunca hızlı bir şekilde göndermeli ve Cloud Firestore kullanarak çalışmayı ertelemelisiniz. "add message" HTTP işlevi, HTTP uç noktasına bir metin değeri iletir ve bu değeri /messages/:documentId/original
yolu altındaki veritabanına ekler.
"Büyük harf yap" işlevini ekleme
"Büyük harf yap" işlevi için kaynak dosyanıza şu satırları ekleyin:
Node.js
// Listens for new messages added to /messages/:documentId/original
// and saves an uppercased version of the message
// to /messages/:documentId/uppercase
exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => {
// Grab the current value of what was written to Firestore.
const original = event.data.data().original;
// Access the parameter `{documentId}` with `event.params`
logger.log("Uppercasing", event.params.documentId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing
// asynchronous tasks inside a function
// such as writing to Firestore.
// Setting an 'uppercase' field in Firestore document returns a Promise.
return event.data.ref.set({uppercase}, {merge: true});
});
Python
@firestore_fn.on_document_created(document="messages/{pushId}")
def makeuppercase(event: firestore_fn.Event[firestore_fn.DocumentSnapshot | None]) -> None:
"""Listens for new documents to be added to /messages. If the document has
an "original" field, creates an "uppercase" field containg the contents of
"original" in upper case."""
# Get the value of "original" if it exists.
if event.data is None:
return
try:
original = event.data.get("original")
except KeyError:
# No "original" field, so do nothing.
return
# Set the "uppercase" field.
print(f"Uppercasing {event.params['pushId']}: {original}")
upper = original.upper()
event.data.reference.update({"uppercase": upper})
"Büyük harf yap" işlevi, dinlenecek belgeyi tanımlayan Cloud Firestore yazıldığında yürütülür. Performans nedeniyle mümkün olduğunca ayrıntılı bilgi vermeniz gerekir.
Ayraçlar (ör. {documentId}
), geri çağırmada eşleşen verilerini gösteren joker karakterler olan "parametreleri" çevreler. Cloud Firestore, yeni mesajlar eklendiğinde geri çağırma işlevini tetikler.
Node.js'de, Cloud Firestore etkinlikleri gibi etkinliğe dayalı işlevler asenkron çalışır. Geri çağırma işlevi null
, bir Nesne veya Promise döndürmelidir.
Herhangi bir değer döndürmezseniz işlevin zaman aşımı gerçekleşir, hata sinyali verilir ve işlev yeniden denenir. Sync, Async, and Promises (Senkron, Eşzamansız ve Sözler) başlıklı makaleyi inceleyin.
İşlevlerinizin yürütülmesini taklit etme
Firebase Local Emulator Suite, uygulamaları bir Firebase projesine dağıtmak yerine yerel makinenizde oluşturup test etmenize olanak tanır. Geliştirme sırasında yerel test yapılması, kısmen üretim ortamında maliyete neden olabilecek kodlama hatalarından kaynaklanan riski düşürdüğü için önemle tavsiye edilir (örneğin, sonsuz döngü).
İşlevlerinizi taklit etmek için:
firebase emulators:start
komutunu çalıştırın ve Emulator Suite UI URL'sinin çıkışını kontrol edin. Varsayılan olarak localhost:4000'dir ancak makinenizde farklı bir bağlantı noktasında barındırılabilir. Emulator Suite UI platformunu açmak için bu URL'yi tarayıcınıza girin.HTTP işlevinin URL'si için
firebase emulators:start
komutunun çıktısını kontrol edin. Bu,http://localhost:5001/MY_PROJECT/us-central1/addMessage
gibi görünür ancak:MY_PROJECT
yerine proje kimliğiniz yazılır.- Bağlantı noktası, yerel makinenizde farklı olabilir.
Sorgu dizesi
?text=uppercaseme
işlevin URL'sinin sonuna ekleyin. Bu, şuna benzer bir şekilde görünmelidir:http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme
. İsteğe bağlı olarak, "uppercaseme" mesajını özel bir mesajla değiştirebilirsiniz.URL'yi tarayıcınızda yeni bir sekmede açarak yeni bir mesaj oluşturun.
İşlevlerin Emulator Suite UI üzerindeki etkilerini görüntüleyin:
Günlükler sekmesinde, HTTP işlevlerinizin başarıyla çalıştığını belirten yeni günlükler görmeniz gerekir:
i functions: Beginning execution of "addMessage"
i functions: Beginning execution of "makeUppercase"
Firestore sekmesinde, orijinal mesajınızı ve mesajınızın büyük harfli sürümünü içeren bir doküman görürsünüz (örneğin, orijinal mesajınız "uppercaseme" ise "UPPERCASEME" olarak görünür).
İşlevleri bir üretim ortamına dağıtma
İşlevleriniz emülatörde istediğiniz gibi çalıştıktan sonra bunları üretim ortamında dağıtma, test etme ve çalıştırma işlemlerine geçebilirsiniz. Üretimde dağıtım yapmak için projenizin Blaze fiyatlandırma planı kapsamında olması gerektiğini unutmayın. Cloud Functions Fiyatlandırma bölümüne bakın.
Eğitimi tamamlamak için işlevlerinizi dağıtın ve ardından bunları yürütün.
İşlevlerinizi dağıtmak için şu komutu çalıştırın:
firebase deploy --only functions
Bu komutu çalıştırdıktan sonra Firebase KSA, tüm HTTP işlevi uç noktalarının URL'sini verir. Terminalinizde aşağıdaki gibi bir satır görmeniz gerekir:
Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
URL, proje kimliğinizin yanı sıra HTTP işlevi için bir bölge içerir. Şu anda bu konuda endişelenmenize gerek olmasa da bazı üretim HTTP işlevleri, ağ gecikmesini en aza indirmek için bir konum belirtmelidir.
"Projeye erişim yetkilendirilemedi" gibi erişim hatalarıyla karşılaşırsanız proje takma adınızı kontrol etmeyi deneyin.
CLI tarafından oluşturulan URL'yi kullanarak bir metin sorgusu parametresi ekleyin ve bunu bir tarayıcıda açın:
https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
İşlev yürütülür ve tarayıcı, metin dizesinin depolandığı veritabanı konumundaki Firebase konsoluna yönlendirilir. Bu yazma etkinliği, dizeyi büyük harfli olarak yazan "büyük harf yap" işlevini tetikler.
İşlevleri dağıtıp yürüttükten sonra günlükleri Google Cloud konsolunda görüntüleyebilirsiniz. Geliştirme veya üretim aşamasındaki işlevleri silmeniz gerekiyorsa Firebase CLI'yı kullanın.
Üretim ortamında, çalıştırılacak minimum ve maksimum örnek sayısını ayarlayarak işlev performansını optimize edebilir ve maliyetleri kontrol edebilirsiniz. Bu çalışma zamanı seçenekleri hakkında daha fazla bilgi için Ölçeklendirme davranışını kontrol etme başlıklı makaleyi inceleyin.
Sonraki adımlar
Bu dokümanda, Cloud Functions için işlevleri yönetme ve Cloud Functions tarafından desteklenen tüm etkinlik türlerini işleme hakkında daha fazla bilgi edinebilirsiniz.
Cloud Functions hakkında daha fazla bilgi edinmek için şunları da yapabilirsiniz:
- Cloud Functions kullanım alanları hakkında bilgi edinin.
- Cloud Functions codelab'ini deneyin.
- GitHub'daki kod örneklerini inceleme ve çalıştırma