Başlayın: İlk işlevlerinizi yazın, test edin ve dağıtın

Cloud Functions özelliğini kullanmaya başlamak için bu eğitimdeki adımları uygulayın. Eğitim, gerekli kurulum görevleriyle başlar ve iki ilgili işlevin oluşturulması, test edilmesi ve dağıtılmasıyla devam eder:

  • Metin değerini kabul eden ve Cloud Firestore değerine yazan bir URL'yi gösteren "mesaj ekle" işlevi.
  • Cloud Firestore yazma işleminde tetiklenen ve metni büyük harfe dönüştüren bir "büyük harfe dönüştürme" işlevi.

İşlevleri içeren örnek kodun tamamı aşağıda verilmiştir:

Node.js

// The Cloud Functions for Firebase SDK to create Cloud Functions and triggers.
const {logger} = require("firebase-functions");
const {onRequest} = require("firebase-functions/https");
const {onDocumentCreated} = require("firebase-functions/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 örnek için Cloud Firestore ve HTTP ile tetiklenen 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 çağrılabilir tetikleyicilerini de destekler. Remote Config ve TestLab tetikleyicileri gibi diğer arka plan tetikleyicileri, bu sayfada açıklanmayan araç setleri kullanılarak etkileşimli olarak test edilebilir.

Bu eğitimde, örneği derlemek, 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 yeni misiniz?

Firebase veya Google Cloud'i kullanmaya yeni 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.

  1. Firebase konsolunda oturum açın.
  2. Yeni bir Firebase projesi oluşturmak için düğmeyi tıklayın.
  3. Metin alanına bir proje adı girin.

    Bir Google Cloud kuruluşunun üyesiyseniz projenizi oluşturacağınız klasörü seçebilirsiniz.

  4. İstenirse Firebase şartlarını inceleyip kabul edin, ardından Devam'ı tıklayın.
  5. (İsteğe bağlı) Firebase konsolunda Yapay Zeka Desteği'ni ("Firebase'de Gemini" olarak adlandırılır) etkinleştirin. Bu özellik, başlangıç yapmanıza ve geliştirme sürecinizi kolaylaştırmanıza yardımcı olabilir.
  6. (İsteğe bağlı) Projeniz için Google Analytics özelliğini ayarlayın. Bu özellik, şu Firebase ürünlerini kullanırken optimum deneyim sağlar: 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.

  7. Proje oluştur'u tıklayın.

Firebase projenizi oluşturur, bazı ilk kaynakları 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. Mevcut bir Google Cloud projesine"Firebase ekleme" hakkında daha fazla bilgi edinin ve sorunları giderin.

  1. Mevcut Google Cloud projesine erişmenizi sağlayan hesapla Firebase konsolunda oturum açın.
  2. Yeni bir Firebase projesi oluşturmak için düğmeyi tıklayın.
  3. Sayfanın alt kısmında Firebase'i Google Cloud projesine ekle'yi tıklayın.
  4. Metin alanına mevcut projenin proje adını girmeye başlayın ve ardından görüntülenen listeden projeyi seçin.
  5. Projeyi aç'ı tıklayın.
  6. İstenirse Firebase şartlarını inceleyip kabul edin, ardından Devam'ı tıklayın.
  7. (İsteğe bağlı) Firebase konsolunda Yapay Zeka Desteği'ni ("Firebase'de Gemini" olarak adlandırılır) etkinleştirin. Bu özellik, başlangıç yapmanıza ve geliştirme sürecinizi kolaylaştırmanıza yardımcı olabilir.
  8. (İsteğe bağlı) Projeniz için Google Analytics özelliğini ayarlayın. Bu özellik, şu Firebase ürünlerini kullanırken optimum deneyim sağlar: 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.

  9. Firebase ekle'yi tıklayın.

Firebase, mevcut projenize Firebase'i 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 KSA'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öntemle Firebase CLI'yı yükleyin. CLI'yı npm aracılığıyla yüklemek için şunu kullanın:

npm install -g firebase-tools

Bu işlem, genel olarak kullanılabilen firebase komutunu yükler. Komut başarısız olursa npm izinlerini değiştirmeniz gerekebilir. firebase-tools aracını en yeni sürüme 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 ise Firebase KSA'ya ihtiyacınız vardır. Bağımlılıkları izole etmek için venv kullanmanızı öneririz. Python'un 3.10 ile 3.13 arasındaki sürümleri desteklenir. Varsayılan çalışma zamanı 3.13'tür.

Python'u yükledikten sonra tercih ettiğiniz yöntemle Firebase CLI'yı yükleyin.

Projenizi ilk kullanıma hazırlayın

Cloud Functions için Firebase SDK'sını başlattığınızda bağımlılıklar ve minimum düzeyde örnek kod 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ğitim için Cloud Firestore aracını da başlatmanız gerekir.

Projenizi başlatmak için:

  1. Tarayıcı üzerinden giriş yapmak ve Firebase KSA'nın kimliğini doğrulamak için firebase login komutunu çalıştırın.
  2. Firebase proje dizininize gidin.
  3. firebase init firestore komutunu çalıştırın. 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 kullanmaya başlama bölümünde açıklandığı gibi Firestore için bir başlangıç modu ve konum seçmeniz gerekir.
  4. firebase init functions komutunu çalıştırın. CLI, mevcut bir kod tabanını seçmenizi veya yeni bir kod tabanı başlatıp adlandırmanızı ister. Başlangıçta varsayılan konumda tek bir kod tabanı yeterlidir. Daha sonra, uygulamanız genişledikçe işlevleri kod tabanlarında düzenlemek isteyebilirsiniz.
  5. 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 hakkında bilgi edinmek için TypeScript ile İşlev Yazma başlıklı makaleyi inceleyin.

  6. CLI, bağımlılıkları yükleme seçeneği sunar. Bağımlılıkları başka bir şekilde yönetmek istiyorsanız bu seçeneği reddedebilirsiniz.

Bu komutlar başarıyla tamamlandıktan sonra proje yapınız aşağıdaki gibi 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 aktarma ve uygulama başlatma

Kurulum görevlerini tamamladıktan sonra kaynak dizini açabilir ve aşağıdaki bölümlerde açıklandığı şekilde kod eklemeye başlayabilirsiniz. Bu örnekte 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/https");
const {onDocumentCreated} = require("firebase-functions/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 Cloud Firestore değişikliklerinin yapılabileceği bir admin uygulama örneği başlatır. Admin SDK desteği, FCM, Authentication ve Firebase Realtime Database için olduğu gibi, sunulduğu her yerde 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 Cloud Functions modülleri için Firebase SDK'sını 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 ekleme

"add message" 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.")

"add message" işlevi bir HTTP uç noktasıdır. Uç noktaya gönderilen 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, mümkün olan en kısa sürede yanıt göndermeniz ve Cloud Firestore kullanarak çalışmayı ertelemeniz gerekir. "add message" HTTP işlevi, HTTP uç noktasına bir metin değeri iletir ve bu değeri /messages/:documentId/original yolunun altındaki veritabanına ekler.

"Büyük harf yap" işlevini ekleme

"make uppercase" 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})

"make uppercase" işlevi, Cloud Firestore belgesine yazma işlemi yapıldığında yürütülür. Bu, dinlenecek belgeyi tanımlar. Performans açısından, mümkün olduğunca spesifik olmanız gerekir.

Süslü parantezler (ör. {documentId}), geri çağırmada eşleşen verilerini gösteren "parametreleri" (joker karakterler) çevreler. Cloud Firestore, yeni mesajlar eklendiğinde geri çağırmayı tetikler.

Node.js'de, Cloud Firestore etkinlikleri gibi etkinliğe dayalı işlevler eşzamansızdır. Geri çağırma işlevi null, bir nesne veya Promise döndürmelidir. Herhangi bir şey döndürmezseniz işlev zaman aşımına uğrar, hata bildirir ve yeniden denenir. Senkron, Eş Zamansız ve Promise'ler bölümüne bakın.

İşlevlerinizin yürütülmesini taklit etme

Firebase Local Emulator Suite, uygulamaları bir Firebase projesine dağıtmak yerine yerel makinenizde derlemenize ve test etmenize olanak tanır. Geliştirme sırasında yerel test yapılması önemle tavsiye edilir. Bunun bir nedeni, üretim ortamında maliyete neden olabilecek kodlama hataları (ör. sonsuz döngü) riskini azaltmasıdır.

İşlevlerinizi emüle etmek için:

  1. firebase emulators:start komutunu çalıştırın ve Emulator Suite UI URL'si için çıkışı kontrol edin. Varsayılan olarak localhost:4000'dir ancak makinenizdeki farklı bir bağlantı noktasında barındırılabilir. Emulator Suite UI sayfasını açmak için bu URL'yi tarayıcınıza girin.

  2. HTTP işlevinin URL'si için firebase emulators:start komutunun çıkışını kontrol edin. Aşağıdaki farklar dışında http://localhost:5001/MY_PROJECT/us-central1/addMessage ile benzer görünür:

    1. MY_PROJECT, proje kimliğinizle değiştirilir.
    2. Yerel makinenizde bağlantı noktası farklı olabilir.
  3. İşlev URL'sinin sonuna ?text=uppercaseme sorgu dizesini ekleyin. Bu, şuna benzer şekilde görünmelidir: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme. İsterseniz "uppercaseme" mesajını özel bir mesajla değiştirebilirsiniz.

  4. URL'yi tarayıcınızda yeni bir sekmede açarak yeni bir mesaj oluşturun.

  5. Emulator Suite UI işlevlerinin etkilerini görüntüleyin:

    1. Logs (Günlükler) sekmesinde, HTTP işlevlerinizin başarıyla çalıştığını gösteren yeni günlükler görürsünüz:

      i functions: Beginning execution of "addMessage"

      i functions: Beginning execution of "makeUppercase"

    2. 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 (Orijinal mesaj "uppercaseme" ise "UPPERCASEME" ifadesini görürsünüz).

İşlevleri ü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 aşamasına geçebilirsiniz. Üretimde dağıtım yapmak için projenizin Blaze fiyatlandırma planında olması gerektiğini unutmayın. Cloud Functions fiyatlandırmasını inceleyin.

Eğitimi tamamlamak için işlevlerinizi dağıtın ve ardından yürütün.

  1. İşlevlerinizi dağıtmak için şu komutu çalıştırın:

     firebase deploy --only functions
     

    Bu komutu çalıştırdıktan sonra Firebase CLI, tüm HTTP işlevi uç noktalarının URL'sini döndürür. Terminalinizde aşağıdaki gibi bir satır görürsünüz:

    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 endişelenmenize gerek olmasa da bazı üretim HTTP işlevleri, ağ gecikmesini en aza indirmek için bir konum belirtmelidir.

    "Projeye erişim yetkilendirilemiyor" gibi erişim hatalarıyla karşılaşırsanız proje takma adınızı kontrol edin.

  2. CLI tarafından oluşturulan URL'yi kullanarak bir metin sorgu parametresi ekleyin ve URL'yi tarayıcıda açın:

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    İşlev yürütülür ve tarayıcıyı, metin dizesinin depolandığı veritabanı konumundaki Firebase konsoluna yönlendirir. Bu yazma etkinliği, dizeyi büyük harfe dönüştüren "make uppercase" 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ında 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 etmek ve maliyetleri kontrol etmek isteyebilirsiniz. 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: