了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

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 birbiriyle ilişkili iki işlevin oluşturulması, test edilmesi ve dağıtılmasıyla devam eden bu öğretici üzerinde çalışmayı deneyin:

  • Bir metin değerini kabul eden ve bunu Cloud Firestore'a yazan bir URL'yi ortaya çıkaran bir "mesaj ekle" işlevi.
  • Bir Cloud Firestore yazmayı tetikleyen ve metni büyük harfe dönüştüren bir "büyük harf yap" işlevi.

Bu örnek için Cloud Firestore ve HTTP ile tetiklenen JavaScript işlevlerini seçtik çünkü bu arka plan tetikleyicileri Firebase Local Emulator Suite aracılığıyla kapsamlı bir şekilde test edilebilir. Bu araç seti ayrıca Realtime Database, PubSub, Auth ve HTTP çağrılabilir tetikleyicilerini de destekler. Remote Config, TestLab ve Analytics tetikleyicileri gibi diğer arka plan tetikleyici türlerinin tümü, 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ı detaylandırır. Kodu çalıştırmayı ve incelemeyi tercih ederseniz, Tam örnek kodu gözden geçirin bölümüne atlayın.

Bir Firebase Projesi Oluşturun

  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ı inceleyin ve kabul edin.

  3. Devam'ı tıklayın.

  4. (İsteğe bağlı) Projeniz için, aşağıdaki Firebase ürünlerinden herhangi birini kullanarak optimum bir deneyim yaşamanızı sağlayan Google Analytics'i kurun:

    Ya mevcut bir Google Analytics hesabını seçin ya da 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 projesi kullanıyorsanız Firebase Ekle'yi ) tıklayın.

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

Node.js ve Firebase CLI'yi kurun

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

Node.js ve npm'yi yükledikten sonra tercih ettiğiniz yöntemle Firebase CLI'yi kurun . 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.

Projenizi başlatın

Firebase SDK for Cloud Functions'ı başlattığınızda, bağımlılıklar ve bazı minimum örnek kodlar içeren boş bir proje oluşturursunuz ve işlevleri oluşturmak için TypeScript veya JavaScript'i seçersiniz. Bu eğitimin amaçları doğrultusunda, Cloud Firestore'u da başlatmanız gerekir.

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ğitim için, Firestore kuralları ve dizin dosyaları istendiğinde varsayılan değerleri kabul edebilirsiniz. Henüz bu projede Cloud Firestore kullanmadıysanız, Cloud Firestore'u kullanmaya başlayın bölümünde açıklandığı gibi Firestore için bir başlangıç ​​modu ve konumu da seçmeniz gerekir.
  4. firebase init functions çalıştırın. CLI, mevcut bir kod tabanını seçmenizi veya yeni bir tane 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 iki seçenek sunar:

    Bu eğitim için JavaScript'i seçin.

  6. CLI size npm ile bağımlılıkları kurma seçeneği sunar. Bağımlılıkları başka bir şekilde yönetmek istiyorsanız reddetmek güvenlidir, ancak reddederseniz, işlevlerinizi öykünmeden veya konuşlandırmadan önce npm install çalıştırmanız gerekir.

Bu komutlar başarıyla tamamlandıktan sonra, proje yapınız şöyle görünür:

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

Başlatma sırasında oluşturulan package.json dosyası önemli bir anahtar içerir: "engines": {"node": "16"} . Bu, işlevleri yazmak ve dağıtmak için Node.js sürümünüzü belirtir. Diğer desteklenen sürümleri seçebilirsiniz .

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 Node require deyimlerini kullanarak içe aktarması gerekir. index.js dosyanıza aşağıdaki gibi satırlar ekleyin:

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require("firebase-functions");

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

Bu satırlar, firebase-functions ve firebase-admin modüllerini 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 sunulduğu her yerde, Bulut İşlevlerini kullanarak Firebase'i entegre etmek için güçlü bir yol sağlar.

Firebase CLI, projenizi başlattığınızda Firebase ve Firebase SDK for Cloud Functions Node modüllerini otomatik olarak yükler. Projenize 3. taraf kitaplıkları eklemek için package.json değiştirebilir ve npm install çalıştırabilirsiniz. Daha fazla bilgi için bkz .

addMessage() işlevini ekleyin

addMessage() işlevi için şu satırları index.js dosyasına ekleyin:

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.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 admin
    .firestore()
    .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.` });
});

addMessage() işlevi bir HTTP bitiş noktasıdır. Uç noktaya yapılan herhangi bir istek onRequest() geri aramasına iletilen ExpressJS tarzı İstek ve Yanıt nesneleri ile sonuçlanır.

HTTP işlevleri senkronizedir ( çağrılabilir işlevlere benzer), bu nedenle mümkün olduğunca çabuk bir yanıt göndermeli ve Cloud Firestore kullanarak işi ertelemelisiniz. addMessage() HTTP işlevi, HTTP uç noktasına bir metin değeri iletir ve bunu /messages/:documentId/original yolu altındaki veritabanına ekler.

makeUppercase() işlevini ekleyin

makeUppercase() işlevi için şu satırları index.js dosyasına ekleyin:

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

makeUppercase() işlevi, Cloud Firestore'a yazıldığında yürütülür. ref.set işlevi, dinlenecek belgeyi tanımlar. Performans nedenleriyle, mümkün olduğunca spesifik olmalısınız.

Ayraçlar—örneğin, {documentId} —surround "parameters", geri aramada eşleşen verilerini gösteren joker karakterler.

Cloud Firestore, her yeni mesaj eklendiğinde onCreate() geri aramasını tetikler.

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

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

Firebase Local Emulator Suite, bir Firebase projesine dağıtmak yerine uygulamaları yerel makinenizde oluşturmanıza ve test etmenize olanak tanır. Kısmen, bir üretim ortamında (örneğin, sonsuz döngü) potansiyel olarak maliyete neden olabilecek kodlama hatalarından kaynaklanan riski azalttığı için, geliştirme sırasında yerel test şiddetle tavsiye edilir.

İşlevlerinizi taklit etmek için:

  1. firebase emulators:start çalıştırın ve Emulator Suite kullanıcı arabiriminin URL'si için çıktıyı kontrol edin. Varsayılan olarak localhost:4000 şeklindedir, ancak makinenizde farklı bir bağlantı noktasında barındırılıyor olabilir. Emulator Suite kullanıcı arayüzünü açmak için tarayıcınıza bu URL'yi girin.

  2. addMessage() 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 gibi görünecektir:

    1. MY_PROJECT proje kimliğiniz ile değiştirilecektir.
    2. Bağlantı noktası, yerel makinenizde farklı olabilir.
  3. ?text=uppercaseme sorgu dizesini işlevin URL'sinin sonuna ekleyin. Bu şöyle görünmelidir: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme . İsteğe bağlı olarak, "büyük harf" mesajını özel bir mesaj olarak 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ı arabirimindeki işlevlerin etkilerini görüntüleyin:

    1. Günlükler sekmesinde, addMessage() ve makeUppercase() işlevlerinin çalıştığını gösteren yeni günlükler 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 halini 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ğıtın

İşlevleriniz öykünücüde istediğiniz gibi çalıştıktan sonra, bunları üretim ortamında dağıtmaya, test etmeye ve çalıştırmaya devam edebilirsiniz. Önerilen Node.js 14 çalışma zamanı ortamına dağıtmak için projenizin Blaze fiyatlandırma planında olması gerektiğini unutmayın. Cloud Functions fiyatlandırmasına bakın.

Öğreticiyi tamamlamak için işlevlerinizi dağıtın ve ardından makeUppercase() öğesini tetiklemek için addMessage() öğesini 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, herhangi bir HTTP işlevi uç noktası için URL'yi çıkarır. Terminalinizde aşağıdaki gibi 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şlevi için bir bölge içerir. Şimdilik 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 etmeyi deneyin.

  2. CLI tarafından çıkan addMessage() URL'sini 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, tarayıcıyı çalıştırır ve metin dizesinin depolandığı veritabanı konumundaki Firebase konsoluna yönlendirir. Bu yazma olayı, dizenin büyük harfli bir sürümünü yazan makeUppercase() işlevini tetikler.

İşlevleri dağıttıktan ve yürüttükten sonra, Google Cloud Console'da günlükleri görüntüleyebilirsiniz. Geliştirme veya üretimdeki işlevleri silmeniz gerekirse 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 Ölçekleme davranışını denetleme konusuna bakın.

Tam örnek kodu inceleyin

İşte addMessage() ve makeUppercase() işlevlerini içeren tamamlanmış functions/index.js . Bu işlevler, Cloud Firestore'a bir değer yazan ve ardından dizedeki tüm karakterleri büyük harfe çevirerek dönüştüren bir HTTP uç noktasına bir parametre iletmenize olanak tanır.

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require("firebase-functions");

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.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 admin
    .firestore()
    .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 creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

Sonraki adımlar

Bu belgede, Cloud Functions işlevlerinin nasıl yönetileceği ve Cloud Functions tarafından desteklenen tüm olay türlerinin nasıl yönetileceği hakkında daha fazla bilgi edinebilirsiniz.

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