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 değerine 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 "büyük harf yap" işlevi.
Bu örnek için Cloud Firestore ve HTTP tarafından tetiklenen JavaScript işlevlerini kısmen Firebase Local Emulator Suite aracılığıyla kapsamlı bir şekilde test edilebilmeleri nedeniyle seçtik. Bu araç seti, Realtime Database, PubSub, Auth ve HTTP çağrılabilir tetikleyicileri de destekler. Remote Config, TestLab ve Analytics tetikleyicileri gibi diğer arka plan tetikleyicilerinin tümü, bu sayfada açıklanmayan araç kümeleri 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. Kodu çalıştırıp incelemeyi tercih ediyorsanız Örnek kodun tamamını inceleme bölümüne atlayın.
Firebase projesi oluşturma
-
Firebase konsolunda Proje ekle'yi tıklayın.
-
Mevcut bir Google Cloud projesine Firebase kaynakları eklemek için projenin adını girin veya açılır menüden proje adını 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.
-
-
İstenirse Firebase şartlarını inceleyip kabul edin.
-
Devam'ı tıklayın.
-
(İ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.
-
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 sağlar. İşlem tamamlandığında Firebase konsolunda Firebase projenizin genel bakış sayfasına yönlendirilirsiniz.
Node.js ve Firebase CLI'yi ayarlama
İşlevleri yazmak için Node.js ortamına, işlevleri ise Cloud Functions çalışma zamanına dağıtmak için Firebase KSA'ya 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.
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şturur ve işlevleri derlemek için TypeScript veya JavaScript'i seçersiniz. Bu eğitim için Cloud Firestore değerini de başlatmanız gerekir.
Projenizi ilk kullanıma hazırlamak için:
- Tarayıcı üzerinden giriş yapmak ve Firebase CLI'nin kimliğini doğrulamak için
firebase login
komutunu çalıştırın. - Firebase proje dizininize gidin.
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 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.firebase init functions
çalıştır. 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.CLI, dil desteği için iki seçenek sunar:
- JavaScript
- TypeScript Daha fazla bilgi için TypeScript ile İşlev Yazma başlıklı makaleyi inceleyin.
Bu eğitim için JavaScript'i seçin.
CLI, npm ile 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 reddetmek güvenlidir. Ancak reddederseniz işlevlerinizi taklit etmeden veya dağıtmadan önce
npm install
'yi çalıştırmanız gerekir.
Bu komutlar başarıyla tamamlandıktan sonra proje yapınız şu şekilde 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çeriyor: "engines": {"node": "16"}
. 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.
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ığı şekilde kod eklemeye başlayabilirsiniz. Bu örnekte, projeniz Node require
ifadelerini kullanarak Cloud Functions ve Admin SDK modüllerini içe aktarmalıdır. 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/v1'); // 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
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 Cloud Functions Node modülleri için Firebase ve Firebase SDK'sını otomatik olarak yükler. Projenize üçüncü taraf kitaplıkları eklemek için package.json
dosyasını değiştirebilir ve npm install
dosyasını çalıştırabilirsiniz.
Daha fazla bilgi için Bağımlılıkları Yönetme bölümüne bakın.
addMessage()
işlevini ekleyin
addMessage()
işlevi için index.js
dosyasına şu satırları 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 uç noktasıdır. Uç noktaya yapılan tüm istekler, onRequest()
geri çağırma işlevine ExpressJS tarzında Request ve Response nesneleri ile sonuçlanır.
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. addMessage()
HTTP işlevi, bir metin değerini HTTP uç noktasına iletir ve /messages/:documentId/original
yolu altında veritabanına ekler.
makeUppercase()
işlevini ekleme
makeUppercase()
işlevi için index.js
dosyasına şu satırları 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ığı zaman yürütülür. ref.set
işlevi, dinlenecek dokümanı tanımlar. Performansı artırmak için
mümkün olduğunca ayrıntı vermeye dikkat edin.
Ayraçlar (ör. {documentId}
), geri çağırmada kendi eşleşen verilerinin gösterildiği "parametreler" ve joker karakterlerle çevrilidir.
Cloud Firestore, yeni mesaj eklendiğinde onCreate()
geri çağırmasını tetikler.
Cloud Firestore etkinlikleri gibi etkinliğe dayalı işlevler eşzamansızdır. 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ğrayarak hata sinyali verir ve işlem 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:
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.addMessage()
HTTP işlevinin URL'si içinfirebase emulators:start
komutunun çıktısını kontrol edin.http://localhost:5001/MY_PROJECT/us-central1/addMessage
ile benzerdir ancak aşağıdakiler farklıdır:MY_PROJECT
, proje kimliğinizle değiştirilecek.- Bağlantı noktası, yerel makinenizde farklı olabilir.
Sorgu dizesini
?text=uppercaseme
işlevin URL'sinin sonuna 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, "büyük harf" mesajını özel bir mesaj olarak değiştirebilirsiniz.URL'yi tarayıcınızda yeni bir sekmede açarak yeni bir ileti oluşturun.
Emulator Suite UI'teki işlevlerin etkilerini görüntüleyin:
Günlükler sekmesinde,
addMessage()
vemakeUppercase()
işlevlerinin ç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"
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. Ö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.
Eğitimi tamamlamak için işlevlerinizi dağıtın ve ardından makeUppercase()
'u tetiklemek için addMessage()
'ü 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ı için URL'yi çıkarı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.
KSA'nın
addMessage()
URL çıkışını kullanarak bir metin sorgusu parametresi ekleyin ve bunu tarayıcıda açın:https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
İşlev çalıştırılır ve tarayıcı, metin dizesinin depolandığı veritabanı konumundaki Firebase konsoluna yönlendirilir. Bu yazma etkinliği, dizenin büyük harfli sürümünü yazan
makeUppercase()
tetikleyicisini 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ılarını belirleyerek 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.
başlıklı makaleyi inceleyin.Örnek kodun tamamını inceleme
addMessage()
ve makeUppercase()
işlevlerini içeren tamamlanmış functions/index.js
işlevi aşağıda verilmiştir. Bu işlevler, bir HTTP uç noktasına bir parametre iletmenize olanak tanır. Bu parametre, Cloud Firestore değerini yazar ve ardından dizedeki tüm karakterleri büyük harf yaparak dönüştürür.
// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers. const functions = require('firebase-functions/v1'); // 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 dokümanda, Cloud Functions için fonksiyonları 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:
- Cloud Functions için kullanım alanları hakkında bilgi edinin.
- Cloud Functions codelab'ini deneyin.
- GitHub'daki kod örneklerini inceleyip çalıştırma