Cloud Functions ile Firebase Realtime Database içindeki etkinlikleri istemci kodunu güncellemenize gerek kalmadan yönetebilirsiniz. Cloud Functions, Realtime Database işlemlerini tam yönetim ayrıcalıklarıyla çalıştırmanıza olanak tanır ve Realtime Database'de yapılan her değişikliğin ayrı ayrı işlenmesini sağlar. Veri anlık görüntüsü veya Admin SDK aracılığıyla Firebase Realtime Database değişiklik yapabilirsiniz.
Tipik bir yaşam döngüsünde, Firebase Realtime Database işlevi şunları yapar:
- Belirli bir Realtime Database yoldaki değişiklikleri bekler.
- Bir etkinlik gerçekleştiğinde tetiklenir ve görevlerini yerine getirir.
- Bu yolda depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır.
Firebase Realtime Database'da veritabanı düğümlerinin yazılması, oluşturulması, güncellenmesi veya silinmesi üzerine bir işlevi tetikleyebilirsiniz. İşlevin ne zaman tetikleneceğini kontrol etmek için etkinlik işleyicilerden birini ve etkinlikleri dinleyeceği Realtime Database yolunu belirtin.
İşlev konumunu ayarlama
Bir Realtime Database örneğinin konumu ile işlevin konumu arasındaki mesafe önemli bir ağ gecikmesine neden olabilir. Ayrıca bölgeler arasındaki uyuşmazlık dağıtım hatasına neden olabilir. Bu durumları önlemek için işlev konumunu, veritabanı örneği konumuyla eşleşecek şekilde belirtin.
Realtime Database etkinliklerini işleme
İşlevler, Realtime Database etkinlikleri iki özgüllük düzeyinde işlemenize olanak tanır. Yalnızca yazma, oluşturma, güncelleme veya silme etkinliklerini dinleyebilir ya da bir referansta yapılan herhangi bir değişikliği dinleyebilirsiniz.
Realtime Database etkinliklerine yanıt vermek için şu işleyiciler kullanılabilir:
onValueWritten()
Realtime Database içinde veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenir.onValueCreated()
Yalnızca Realtime Database içinde veri oluşturulduğunda tetiklenir.onValueUpdated()
Yalnızca Realtime Database içinde veriler güncellendiğinde tetiklenir.onValueDeleted()
Yalnızca Realtime Database içinde veriler silindiğinde tetiklenir.
on_value_written()
Realtime Database içinde veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenir.on_value_created()
Yalnızca Realtime Database içinde veri oluşturulduğunda tetiklenir.on_value_updated()
Yalnızca Realtime Database içinde veriler güncellendiğinde tetiklenir.on_value_deleted()
Yalnızca Realtime Database içinde veriler silindiğinde tetiklenir.
Gerekli modülleri içe aktarma
İşlev kaynağınızda, kullanmak istediğiniz SDK modüllerini içe aktarmanız gerekir. Bu örnekte, Realtime Database modülüne yazmak için Realtime Database modülünün yanı sıra HTTP ve Realtime Database modüllerinin de içe aktarılması gerekir.Firebase Admin SDK
// The Cloud Functions for Firebase SDK to setup triggers and logging.
const {onRequest} = require("firebase-functions/v2/https");
const {onValueCreated} = require("firebase-functions/v2/database");
const {logger} = require("firebase-functions");
// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require("firebase-admin");
admin.initializeApp();
# The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
from firebase_functions import db_fn, https_fn
# The Firebase Admin SDK to access the Firebase Realtime Database.
from firebase_admin import initialize_app, db
app = initialize_app()
Örneği ve yolu belirtin
İşlevinizin ne zaman ve nerede tetikleneceğini kontrol etmek için işlevinizi bir yolla ve isteğe bağlı olarak bir Realtime Database örneğiyle yapılandırın. Bir örnek belirtmezseniz işlev, işlev bölgesindeki tüm Realtime Database örneklerini dinler. Aynı bölgedeki örneklerin seçici bir alt kümesine dağıtmak için Realtime Database örnek kalıbı da belirtebilirsiniz.
Örneğin:
// All Realtime Database instances in default function region us-central1 at path "/user/{uid}" // There must be at least one Realtime Database present in us-central1. const onWrittenFunctionDefault = onValueWritten("/user/{uid}", (event) => { // … }); // Instance named "my-app-db-2", at path "/user/{uid}". // The "my-app-db-2" instance must exist in this region. const OnWrittenFunctionInstance = onValueWritten( { ref: "/user/{uid}", instance: "my-app-db-2" // This example assumes us-central1, but to set location: // region: "europe-west1" }, (event) => { // … } ); // Instance with "my-app-db-" prefix, at path "/user/{uid}", where uid ends with @gmail.com. // There must be at least one Realtime Database with "my-app-db-*" prefix in this region. const onWrittenFunctionInstance = onValueWritten( { ref: "/user/{uid=*@gmail.com}", instance: "my-app-db-*" // This example assumes us-central1, but to set location: // region: "europe-west1" }, (event) => { // … } );
# All Realtime Database instances in default function region us-central1 at path "/user/{uid}"
# There must be at least one Realtime Database present in us-central1.
@db_fn.on_value_written(r"/user/{uid}")
def onwrittenfunctiondefault(event: db_fn.Event[db_fn.Change]):
# ...
pass
# Instance named "my-app-db-2", at path "/user/{uid}".
# The "my-app-db-2" instance must exist in this region.
@db_fn.on_value_written(
reference=r"/user/{uid}",
instance="my-app-db-2",
# This example assumes us-central1, but to set location:
# region="europe-west1",
)
def on_written_function_instance(event: db_fn.Event[db_fn.Change]):
# ...
pass
# Instance with "my-app-db-" prefix, at path "/user/{uid}", where uid ends with @gmail.com.
# There must be at least one Realtime Database with "my-app-db-*" prefix in this region.
@db_fn.on_value_written(
reference=r"/user/{uid=*@gmail.com}",
instance="my-app-db-*",
# This example assumes us-central1, but to set location:
# region="europe-west1",
)
def on_written_function_instance(event: db_fn.Event[db_fn.Change]):
# ...
pass
Bu parametreler, işlevinizi Realtime Database örneğindeki belirli bir yolda yazma işlemlerini yönetecek şekilde yönlendirir.
Yol belirtimleri, yolun tüm yazma işlemlerini (altındaki herhangi bir yerde gerçekleşen yazma işlemleri dahil) eşleştirir. İşlevinizin yolunu /foo/bar
olarak ayarlarsanız aşağıdaki konumların her ikisindeki etkinliklerle eşleşir:
/foo/bar
/foo/bar/baz/really/deep/path
Her iki durumda da Firebase, etkinliğin /foo/bar
tarihinde gerçekleştiğini yorumlar ve etkinlik verileri, /foo/bar
tarihindeki eski ve yeni verileri içerir. Etkinlik verileri büyük olabilir. Bu durumda, veritabanınızın kökünün yakınında tek bir işlev kullanmak yerine daha derin yollarda birden fazla işlev kullanmayı düşünebilirsiniz. En iyi performans için
yalnızca mümkün olan en derin düzeydeki verileri isteyin.
Joker karakter kullanma ve yakalama
Kayıt için {key}
, {key=*}
, {key=prefix*}
, {key=*suffix}
cihazlarını kullanabilirsiniz. Tek segmentli joker karakterler için *
, prefix*
, *suffix
.
Not: **
, Realtime Database tarafından desteklenmeyen çok segmentli joker karakterleri temsil eder.
Yol kalıplarını anlama başlıklı makaleyi inceleyin.
Yol joker karakteri. Bir yol bileşenini joker karakter olarak belirtebilirsiniz:
- Yıldız işareti (
*
) kullanma Örneğin,foo/*
,foo/
'nin altındaki düğüm hiyerarşisinin bir düzeyindeki tüm alt öğelerle eşleşir. - Tam olarak yıldız işareti (
*
) içeren bir segment kullanma. Örneğin,foo/app*-us
foo/
öğesinin altındakiapp
ön eki ve-us
sonekiyle eşleşen tüm alt segmentlerle eşleşir.
Joker karakter içeren yollar, örneğin tek bir yazma işleminden birden fazla etkinlikle eşleşebilir. Şunun eklenmesi:
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
"/foo/*"
yoluyla iki kez eşleşir: bir kez "hello": "world"
ile, bir kez de "firebase": "functions"
ile.
Yol yakalama. İşlev kodunuzda kullanılacak yol eşleşmelerini adlandırılmış değişkenlere (ör. /user/{uid}
, /user/{uid=*-us}
) kaydedebilirsiniz.
Yakalanan değişkenlerin değerleri, işlevinizin database.DatabaseEvent.params nesnesinde kullanılabilir.
Örnek joker karakteri. Ayrıca, joker karakter kullanarak bir örnek bileşeni de belirtebilirsiniz. Bir örnek joker karakteri önek, sonek veya her ikisini de içerebilir (ör. my-app-*-prod
).
Joker karakter ve yakalama referansı
Cloud Functions (2. nesil) ve Realtime Database ile ref
ve instance
belirtilirken bir desen kullanılabilir. Her tetikleyici arayüzünde, bir işlevin kapsamını belirlemek için aşağıdaki seçenekler bulunur:
Belirtme ref |
Belirtme instance |
Davranış |
---|---|---|
Tek (/foo/bar ) |
Belirtilmiyor | İşleyiciyi, işlev bölgesindeki tüm örneklerle sınırlandırır. |
Tek (/foo/bar ) |
Tek (‘my-new-db' ) |
İşleyiciyi, işlev bölgesindeki belirli örnekle sınırlandırır. |
Tek (/foo/bar ) |
Desen (‘inst-prefix*' ) |
Kapsam işleyici, işlev bölgesindeki kalıpla eşleşen tüm örnekler için geçerlidir. |
Desen (/foo/{bar} ) |
Belirtilmiyor | İşleyiciyi, işlev bölgesindeki tüm örneklerle sınırlandırır. |
Desen (/foo/{bar} ) |
Tek (‘my-new-db' ) |
İşleyiciyi, işlev bölgesindeki belirli örnekle sınırlandırır. |
Desen (/foo/{bar} ) |
Desen (‘inst-prefix*' ) |
Kapsam işleyici, işlev bölgesindeki kalıpla eşleşen tüm örnekler için geçerlidir. |
Etkinlik verilerini işleme
Bir Realtime Database etkinliği tetiklendiğinde, işleyici işlevinize bir Event
nesnesi iletilir.
Bu nesne, oluşturma ve silme etkinlikleri için oluşturulan veya silinen verilerin anlık görüntüsünü içeren bir data
özelliğine sahiptir.
Bu örnekte işlev, başvurulan yolun verilerini alır, bu konumdaki dizeyi büyük harfe dönüştürür ve değiştirilen dizeyi veritabanına yazar:
// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
// for all databases in 'us-central1'
exports.makeuppercase = onValueCreated(
"/messages/{pushId}/original",
(event) => {
// Grab the current value of what was written to the Realtime Database.
const original = event.data.val();
logger.log("Uppercasing", event.params.pushId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing
// asynchronous tasks inside a function, such as
// writing to the Firebase Realtime Database.
// Setting an "uppercase" sibling in the
// Realtime Database returns a Promise.
return event.data.ref.parent.child("uppercase").set(uppercase);
},
);
@db_fn.on_value_created(reference="/messages/{pushId}/original")
def makeuppercase(event: db_fn.Event[Any]) -> None:
"""Listens for new messages added to /messages/{pushId}/original and
creates an uppercase version of the message to /messages/{pushId}/uppercase
"""
# Grab the value that was written to the Realtime Database.
original = event.data
if not isinstance(original, str):
print(f"Not a string: {event.reference}")
return
# Use the Admin SDK to set an "uppercase" sibling.
print(f"Uppercasing {event.params['pushId']}: {original}")
upper = original.upper()
parent = db.reference(event.reference).parent
if parent is None:
print("Message can't be root node.")
return
parent.child("uppercase").set(upper)
Önceki değeri okuma
write
veya update
etkinliklerinde data
özelliği, tetikleyici etkinlikten önce ve sonraki veri durumunu temsil eden iki anlık görüntüyü içeren bir Change
nesnesidir.
Change
nesnesinde, etkinlikten önce Realtime Database öğesine kaydedilenleri incelemenize olanak tanıyan bir before
özelliği ve etkinlik gerçekleştikten sonra verilerin durumunu temsil eden bir after
özelliği bulunur.
Örneğin, before
özelliği, işlevin metni yalnızca ilk oluşturulduğunda büyük harfe çevirmesini sağlamak için kullanılabilir:
exports makeUppercase = onValueWritten("/messages/{pushId}/original", (event) => { // Only edit data when it is first created. if (event.data.before.exists()) { return null; } // Exit when the data is deleted. if (!event.data.after.exists()) { return null; } // Grab the current value of what was written to the Realtime Database. const original = event.data.after.val(); console.log('Uppercasing', event.params.pushId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing asynchronous tasks inside a Functions such as // writing to the Firebase Realtime Database. // Setting an "uppercase" sibling in the Realtime Database returns a Promise. return event.data.after.ref.parent.child('uppercase').set(uppercase); });
@db_fn.on_value_written(reference="/messages/{pushId}/original")
def makeuppercase2(event: db_fn.Event[db_fn.Change]) -> None:
"""Listens for new messages added to /messages/{pushId}/original and
creates an uppercase version of the message to /messages/{pushId}/uppercase
"""
# Only edit data when it is first created.
if event.data.before is not None:
return
# Exit when the data is deleted.
if event.data.after is None:
return
# Grab the value that was written to the Realtime Database.
original = event.data.after
if not hasattr(original, "upper"):
print(f"Not a string: {event.reference}")
return
# Use the Admin SDK to set an "uppercase" sibling.
print(f"Uppercasing {event.params['pushId']}: {original}")
upper = original.upper()
parent = db.reference(event.reference).parent
if parent is None:
print("Message can't be root node.")
return
parent.child("uppercase").set(upper)