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


Cloud Functions'ü kullanmaya başlamak için gerekli kurulum görevleriyle başlayan ve iki ilgili işlevi oluşturma, test etme ve dağıtma adımlarını içeren bu eğitimden yararlanabilirsiniz:

  • Metin değerini kabul eden ve Cloud Firestore alanına yazan bir URL gösteren bir "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 ö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/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 örnek için Cloud Firestore ve HTTP tarafından tetiklenen işlevleri kısmen bu arka plan tetikleyicilerin Firebase Local Emulator Suite aracılığıyla kapsamlı bir şekilde test edilebilmesi nedeniyle seçtik. Bu araç seti, Realtime Database, Cloud Storage, PubSub, Auth ve HTTP çağrılabilir 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ğitimdeki aşağıdaki bölümlerde, örneği derlemek, test etmek ve dağıtmak için gereken adımlar ayrıntılı olarak açıklanmıştır.

Firebase projesi oluşturma

  1. Firebase konsolunda Proje ekle'yi tıklayın.

    • Mevcut bir Google Cloud projesine Firebase kaynağı eklemek için proje adını girin veya açılır menüden seçin.

    • Yeni bir proje oluşturmak için istediğiniz proje adını girin. İsterseniz proje adının altında görüntülenen proje kimliğini de düzenleyebilirsiniz.

  2. İstenirse Firebase şartlarını inceleyip kabul edin.

  3. Devam'ı tıklayın.

  4. (İsteğe bağlı) Projeniz için Google Analytics'yi ayarlayın. Bu, aşağıdaki Firebase ürünlerinden herhangi birini kullanırken optimum bir deneyim yaşamanızı sağlar:

    Mevcut bir Google Analytics hesabını seçin veya yeni 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.

  5. Proje oluştur'u (veya mevcut bir Google Cloud projesi kullanıyorsanız Firebase ekle'yi) tıklayın.

Firebase, Firebase projeniz için kaynakları otomatik olarak sağlar. İşlem tamamlandığında Firebase konsolunda Firebase projenizin genel bakış sayfasına yönlendirilirsiniz.

Ortamınızı ve Firebase CLI'yi ayarlama

Node.js

İşlev yazmak için bir Node.js ortamına, işlevleri Cloud Functions çalışma zamanına dağıtmak için ise Firebase CLI'ye ihtiyacınız vardır. Node.js ve npm'i yüklemek için Node Version Manager kullanılması önerilir.

Node.js ve npm'yi yükledikten sonra, tercih ettiğiniz yöntemle Firebase CLI'yi yükleyin. CLI'yi npm üzerinden yüklemek için:

npm install -g firebase-tools

Bu işlem, dünya genelinde kullanılabilen firebase komutunu yükler. Komut başarısız olursa npm izinlerini değiştirmeniz gerekebilir. firebase-tools'ün en son sürümüne güncellemek için aynı komutu yeniden çalıştırın.

Python

İşlev yazmak için bir Python ortamına, işlevleri Cloud Functions çalışma zamanına dağıtmak için ise Firebase CLI'ye ihtiyacınız vardır. Bağımlılıkları ayırmak için venv kullanmanızı öneririz. 3.10 ve 3.11 Python sürümleri desteklenir.

Python'u yükledikten sonra, tercih ettiğiniz yöntemle Firebase CLI'yi 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şlev oluşturmak için TypeScript veya JavaScript'i seçebilirsiniz. Bu eğitim kapsamında Cloud Firestore değerini de başlatmanız gerekir.

Projenizi ilk kullanıma hazırlamak için:

  1. Tarayıcı üzerinden giriş yapmak ve Firebase CLI'nin kimliğini doğrulamak için firebase login komutunu çalıştırın.
  2. Firebase proje dizininize gidin.
  3. firebase init firestore'ü çalıştırın. Bu eğitimde, Firestore kuralları ve dizin dosyaları için istemde bulunulduğunda 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 da seçmeniz gerekir.
  4. firebase init functions'ü çalıştırın. CLI, mevcut bir kod tabanını seçmenizi veya yeni bir kod tabanı oluşturup adlandırmanızı ister. Yeni başladığınızda 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'u seçin. TypeScript'te içerik oluşturma 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 isteği reddedebilirsiniz.

Bu komutlar başarıyla tamamlandıktan sonra projenizin yapısı 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şlev yazmak ve dağıtmak için kullandığınız Node.js sürümünü 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 uygulamayı başlatma

Kurulum görevlerini tamamladıktan sonra kaynak dizini açıp aşağıdaki bölümlerde açıklandığı şekilde kod eklemeye başlayabilirsiniz. Bu örnekte projenizin Cloud Functions ve Yönetici SDK'sı 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 Cloud Firestore değişikliklerinin yapılabileceği bir admin uygulama örneğini başlatır. FCM, Authentication ve Firebase Realtime Database için olduğu gibi Admin SDK desteğinin sunulduğu her yerde Cloud Functions'i 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ıklarla başa çıkma başlıklı makaleyi inceleyin.

"Mesaj ekle" işlevini ekleme

"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. Bitiş noktasına yapılan tüm istekler, platformunuzun istek işleyicisine (onRequest() veya on_request) istek ve yanıt nesnelerinin iletilmesine neden olur.

HTTP işlevleri senkronizedir (çağrılabilir işlevlere benzer), bu nedenle mümkün olduğunca hızlı bir şekilde yanıt göndermeniz ve Cloud Firestore kullanarak işi ertelememeniz gerekir. "add message" HTTP işlevi, bir metin değerini HTTP uç noktasına iletir ve /messages/:documentId/original yolu altında veritabanına ekler.

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

"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, Cloud Firestore yazıldığında yürütülür ve dinlenecek belgeyi tanımlar. Performans nedeniyle mümkün olduğunca ayrıntılı bilgi vermeniz gerekir.

"Parametreler", eşleşen verilerini geri çağırma işlevinde gösteren joker karakterler, köşeli parantezlerle (ör. {documentId}) çevrilir. Cloud Firestore, yeni mesajlar eklendiğinde geri çağırma işlevini tetikler.

Node.js'de Cloud Firestore etkinlikleri gibi etkinlik odaklı işlevler asenkrondur. Geri çağırma işlevi bir null, nesne veya Promise döndürmelidir. Hiçbir şey döndürmezseniz işlev zaman aşımına uğrar, hata sinyali verir ve yeniden denenir. Senkronizasyon, Eşzamansız İşlemler ve Sözler başlıklı makaleyi inceleyin.

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

Firebase Local Emulator Suite, Firebase projesine dağıtmak yerine yerel makinenizde uygulama oluşturmanıza 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ının (ör. sonsuz döngü) riskini azaltmasıdır.

İşlevlerinizi taklit etmek için:

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

  2. HTTP işlevinin URL'si için firebase emulators:startkomutunun çıktısını kontrol edin. http://localhost:5001/MY_PROJECT/us-central1/addMessage ile benzerdir ancak aşağıdakiler farklıdır:

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

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

  5. Emulator Suite UI'teki işlevlerin etkilerini görüntüleyin:

    1. Günlükler sekmesinde, HTTP işlevlerinizin başarıyla çalıştığını belirten 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 iletinizi ve iletinizin büyük harfli sürümünü içeren bir doküman görürsünüz (orijinal olarak "uppercaseme" ise "UPPERCASEME" görürsünüz).

İşlevleri üretim ortamına dağıtma

İşlevleriniz emülatörde istendiği gibi çalıştıktan sonra bunları üretim ortamında dağıtmaya, test etmeye ve çalıştırmaya devam edebilirsiniz. Üretimde dağıtmak için projenizin Blaze fiyatlandırma planında olması gerektiğini unutmayın. Cloud Functions fiyatlandırmasına bakın.

Eğitimi tamamlamak için işlevlerinizi dağıtın ve ardından çalıştırı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 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 için yetkilendirme yapılamıyor" gibi erişim hatalarıyla karşılaşırsanız proje takma adınızı kontrol etmeyi deneyin.

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

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

    İşlev çalıştırılır ve tarayıcıyı, metin dizesinin depolandığı veritabanı konumundaki Firebase konsoluna yönlendirir. Bu yazma etkinliği, dizenin büyük harfli bir sürümünü yazan "make uppercase" işlevini tetikler.

İşlevleri dağıtıp çalıştırdıktan sonra günlükleri Google Cloud konsolunda görüntüleyebilirsiniz. Geliştirme veya üretim aşamasında işlevleri silmeniz gerekiyorsa Firebase CLI'yi kullanın.

Üretimde, ç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.

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 aşağıdakileri de yapabilirsiniz: