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


Cloud Functions'ı kullanmaya başlamak için gerekli kurulum görevleriyle başlayan ve ilgili iki işlevin oluşturulması, test edilmesi ve dağıtılması yoluyla çalışan bu eğiticiyi incelemeyi deneyin:

  • Bir metin değeri kabul eden ve bunu Cloud Firestore'a yazan bir URL'yi ortaya çıkaran 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 tam örnek kodu burada 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 örnek için Cloud Firestore ve HTTP ile tetiklenen işlevleri kısmen bu arka plan tetikleyicilerinin Firebase Local Emulator Suite aracılığıyla kapsamlı bir şekilde test edilebilmesi nedeniyle seçtik. Bu araç seti ayrıca Gerçek Zamanlı Veritabanı, Bulut Depolama, PubSub, Auth ve HTTP çağrılabilir tetikleyicilerini 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 öğreticinin aşağıdaki bölümleri, örneği oluşturmak, test etmek ve dağıtmak için gereken adımları ayrıntılı olarak açıklamaktadır.

Firebase Projesi Oluşturma

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

    • Firebase kaynaklarını mevcut bir Google Cloud projesine 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. İsteğe bağlı olarak 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, aşağıdaki Firebase ürünlerinden herhangi birini kullanırken en iyi deneyimi yaşamanıza olanak tanıyan Google Analytics'i kurun:

    Mevcut bir Google Analytics hesabını seçin veya yeni bir hesap oluşturun.

    Yeni bir hesap oluşturursanız Analytics raporlama konumunuzu seçin ve 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 projesini kullanıyorsanız Firebase Ekle'yi ) tıklayın.

Firebase, Firebase projeniz için kaynakları otomatik olarak hazırlar. İşlem tamamlandığında Firebase konsolundaki Firebase projenizin genel bakış sayfasına yönlendirileceksiniz.

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

Node.js

İşlevleri 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 olacak. Node.js ve npm'yi yüklemek için Node Sürüm Yöneticisi önerilir.

Node.js ve npm'yi yükledikten sonra Firebase CLI'yi tercih ettiğiniz yöntemle yükleyin . CLI'yi npm aracılığıyla yüklemek için şunu kullanın:

npm install -g firebase-tools

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

Python

İşlevleri yazmak için bir Python ortamına ihtiyacınız olacak ve işlevleri Cloud Functions çalışma zamanına dağıtmak için Firebase CLI'ye ihtiyacınız olacak. Bağımlılıkları izole etmek için venv kullanmanızı öneririz. Python 3.10 ve 3.11 sürümleri desteklenmektedir.

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

Projenizi başlatın

Cloud Functions için Firebase SDK'yı 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ğitimin amaçları doğrultusunda Cloud Firestore'u da başlatmanız gerekecektir.

Projenizi başlatmak için:

  1. Tarayıcı aracılığıyla oturum açmak ve Firebase CLI'nin kimliğini doğrulamak için firebase login ç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ı istendiğinde varsayılan değerleri kabul edebilirsiniz. Bu projede henüz Cloud Firestore'u kullanmadıysanız, Cloud Firestore'u kullanmaya başlama bölümünde açıklandığı gibi Firestore için bir başlangıç ​​modu ve konumu da seçmeniz gerekecektir.
  4. firebase init functions çalıştırın. CLI sizden mevcut bir kod tabanını seçmenizi veya yeni bir kod tabanını başlatıp adlandırmanızı ister. Yeni başladığınızda, varsayılan konumdaki tek bir kod tabanı yeterlidir; Daha sonra uygulamanız genişledikçe işlevleri kod tabanlarında düzenlemek isteyebilirsiniz.
  5. CLI size dil desteği için şu seçenekleri sunar:

    • JavaScript
    • TypeScript
    • Python

    Bu eğitim için JavaScript veya Python'u seçin. TypeScript'te yazmak için bkz. TypeScript ile İşlev Yazma .

  6. CLI size bağımlılıkları yükleme seçeneği sunar. Bağımlılıkları başka bir şekilde yönetmek istiyorsanız bunu reddetmek güvenlidir.

Bu komutlar başarıyla tamamlandıktan sonra proje yapınız şöyle 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şlevlerin yazılması ve dağıtılması 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 anlatıldığı 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 Cloud Firestore değişikliklerinin yapılabileceği bir admin uygulaması örneğini başlatır. FCM, Kimlik Doğrulama ve Firebase Gerçek Zamanlı Veritabanı için olduğu gibi Admin SDK desteğinin mevcut olduğu her yerde, Cloud Functions'ı kullanarak Firebase'i entegre etmenin güçlü bir yolunu sağlar.

Firebase CLI, projenizi başlattığınızda Firebase Admin SDK'yı ve Firebase SDK for Cloud Functions modüllerini otomatik olarak yükler. Projenize 3. taraf kitaplıkları ekleme hakkında daha fazla bilgi için bkz . Bağımlılıkları Yönetme .

"Mesaj ekle" işlevini ekleyin

"Mesaj ekle" işlevi için şu satırları kaynak dosyanıza 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 herhangi bir istek, platformunuzun istek işleyicisine ( onRequest() veya on_request ) iletilen istek ve yanıt nesneleri ile sonuçlanır.

HTTP işlevleri eşzamanlıdır ( çağrılabilir işlevlere benzer), bu nedenle mümkün olduğu kadar hızlı bir yanıt göndermeli ve Cloud Firestore'u kullanarak çalışmayı ertelemelisiniz. "Mesaj ekle" HTTP işlevi, HTTP uç noktasına bir metin değeri iletir ve bunu /messages/:documentId/original yolu altına veritabanına ekler.

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

"Büyük harf yap" işlevi için şu satırları kaynak dosyanıza 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})

Cloud Firestore'a yazıldığında "büyük harf yap" işlevi yürütülür ve dinlenecek belgeyi tanımlar. Performans nedenleriyle mümkün olduğunca spesifik olmalısınız.

Parantez (örneğin, {documentId} geri aramada eşleşen verileri ortaya çıkaran joker karakterler olan "parametreleri" çevreler. Cloud Firestore, yeni mesajlar eklendiğinde geri aramayı tetikler.

Node.js'de Cloud Firestore olayları gibi olaya dayalı işlevler eşzamansızdır. Geri çağırma işlevi ya bir null , bir Object ya da bir Promise döndürmelidir. Hiçbir şey döndürmezseniz, işlev zaman aşımına uğrar ve bir hata sinyali verir ve yeniden denenir. Bkz. Senkronizasyon, Async ve Promises .

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

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ı önemle tavsiye edilir, çünkü kısmen üretim ortamında potansiyel olarak maliyete yol açabilecek kodlama hatalarından (örneğin sonsuz döngü) kaynaklanan riski azaltır.

İşlevlerinizi taklit etmek için:

  1. firebase emulators:start ve kontrol edin. Varsayılan olarak localhost:4000 şeklindedir ancak makinenizdeki farklı bir bağlantı noktasında barındırılıyor olabilir. Emulator Suite kullanıcı arayüzü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 çıktısını kontrol edin. Aşağıdakiler dışında http://localhost:5001/MY_PROJECT/us-central1/addMessage benzer görünecektir:

    1. MY_PROJECT proje kimliğiniz ile değiştirilecek.
    2. Bağlantı noktası yerel makinenizde farklı olabilir.
  3. İşlev URL'sinin sonuna ?text=uppercaseme harf sorgu dizesini ekleyin. Bu şuna benzemelidir: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme . İsteğe bağlı olarak "büyük harf" 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 kullanıcı arayüzündeki işlevlerin etkilerini görüntüleyin:

    1. Günlükler sekmesinde, HTTP işlevlerinizin başarıyla çalıştığını gösteren yeni günlükleri görmelisiniz:

      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 versiyonunu içeren bir belge görmelisiniz (başlangıçta "büyük harf" ise, "BÜYÜK HARF" göreceksiniz).

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

İşlevleriniz öykünücüde istediğiniz gibi çalışmaya başladı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. Bulut İşlevleri fiyatlandırmasına bakın.

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

  1. İşlevlerinizi dağıtmak için bu 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 çıkarır. Terminalinizde aşağıdakine benzer bir satır görmelisiniz:

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

    URL, proje kimliğinizin yanı sıra HTTP işlevine yönelik bir bölgeyi de içerir. Şu anda bu konuda endişelenmenize gerek olmasa da, bazı üretim HTTP işlevlerinin ağ gecikmesini en aza indirecek bir konum belirtmesi gerekir.

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

  2. CLI'nin URL çıkışını kullanarak bir metin sorgu parametresi ekleyin ve bunu bir tarayıcıda açın:

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

    İşlev, tarayıcıyı metin dizesinin depolandığı veritabanı konumunda çalıştırır ve Firebase konsoluna yönlendirir. Bu yazma olayı, dizenin büyük harfli versiyonunu 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'yi kullanın.

Üretimde, ç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 bkz . Ölçekleme davranışını denetleme .

Sonraki adımlar

Bu belgede, Cloud Functions'a yönelik işlevlerin nasıl yönetileceği ve Cloud Functions tarafından desteklenen tüm olay türlerinin nasıl ele alınacağı hakkında daha fazla bilgi edinebilirsiniz.

Bulut İşlevleri hakkında daha fazla bilgi edinmek için aşağıdakileri de yapabilirsiniz: