Cloud Functions ile istemci kodunu güncellemenize gerek kalmadan Firebase Realtime Database'teki etkinlikleri yönetebilirsiniz. Cloud Functions, Realtime Database işlemlerini tam yönetici ayrıcalıklarıyla çalıştırmanıza olanak tanır ve Realtime Database'da yapılan her değişikliğin ayrı ayrı işlenmesini sağlar. Veri anlık görüntüsü veya Yönetici SDK'sı aracılığıyla Firebase Realtime Database değişiklikleri yapabilirsiniz.
Tipik bir yaşam döngüsünde Firebase Realtime Database işlevi aşağıdakileri yapar:
- Belirli bir Realtime Database yolunda değişiklik yapılmasını bekler.
- Bir etkinlik gerçekleştiğinde tetiklenir ve görevlerini gerçekleştirir.
- Söz konusu yolda depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır.
Firebase Realtime Database'te veritabanı düğümlerinin yazılmasına, oluşturulmasına, güncellenmesine veya silinmesine yanıt olarak bir işlevi tetikleyebilirsiniz. Fonksiyonun 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 ölçüde ağ gecikmesi oluşturabilir. Ayrıca bölgeler arasındaki uyuşmazlık, dağıtımın başarısız olması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 etkinliklerini iki düzeyde işlemenize olanak tanır: Yalnızca yazma, oluşturma, güncelleme veya silme etkinliklerini dinleyebilir ya da bir referanstaki her türlü değişikliği dinleyebilirsiniz.
Realtime Database etkinliklerine yanıt vermek için aşağıdaki işleyiciler kullanılabilir:
onValueWritten()
Realtime Database alanında veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenir.onValueCreated()
Yalnızca Realtime Database öğesinde veri oluşturulduğunda tetiklenir.onValueUpdated()
Yalnızca Realtime Database öğesinde veriler güncellendiğinde tetiklenir.onValueDeleted()
Yalnızca Realtime Database alanında veri silindiğinde tetiklenir.
on_value_written()
Realtime Database alanında veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenir.on_value_created()
Yalnızca Realtime Database öğesinde veri oluşturulduğunda tetiklenir.on_value_updated()
Yalnızca Realtime Database öğesinde veriler güncellendiğinde tetiklenir.on_value_deleted()
Yalnızca Realtime Database alanında veri 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'e yazmak için Firebase Admin SDK modülünün yanı sıra HTTP ve Realtime Database modüllerinin de içe aktarılması gerekir.
// 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 tetiklenmesi gerektiğini kontrol etmek için işlevinizi bir yol 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 belirli bir alt kümedeki örneklere dağıtmak için bir 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 yoldaki yazma işlemlerini gerçekleştirecek şekilde yönlendirir.
Yol spesifikasyonları, bir yola dokunan tüm yazma işlemleriyle (altındaki herhangi bir yerde gerçekleşen yazma işlemleri dahil) eşleşir. İşlevinizin yolunu /foo/bar
olarak ayarlarsanız bu işlev aşağıdaki iki konumdaki 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 olabilirse veritabanınızın köküne yakın tek bir işlev yerine daha derin yollarda birden fazla işlev kullanmayı düşünün. En iyi performans için yalnızca mümkün olan en derin düzeyde veri isteyin.
Joker karakter kullanımı ve yakalama
Kayıt için {key}
, {key=*}
, {key=prefix*}
, {key=*suffix}
kullanabilirsiniz. Tek segmentli joker karakter kullanımı 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 için joker karakter kullanımı. Bir yol bileşenini joker karakter olarak belirtebilirsiniz:
- Yıldız işareti
*
kullanarak. Örneğin,foo/*
,foo/
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 kullanmak. Örneğin,foo/app*-us
,foo/
altındaki tüm alt segmentlerleapp
ön ekiyle ve-us
son ekiyle eşleşir.
Joker karakter içeren yollar, örneğin tek bir yazma işleminden birden fazla etkinliği eşleştirebilir.
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
"/foo/*"
yolunu iki kez eşleştirir: bir kez "hello": "world"
ile ve tekrar "firebase": "functions"
ile.
Yol yakalama. Yol eşleşmelerini, işlev kodunuzda kullanılacak adlandırılmış değişkenlerde yakalayabilirsiniz (ör. /user/{uid}
, /user/{uid=*-us}
).
Yakalama değişkenlerinin değerleri, işlevinizin database.DatabaseEvent.params nesnesinde bulunur.
Örnek joker karakter kullanımı. Joker karakter kullanarak bir örnek bileşen de belirtebilirsiniz. Örnek joker karakterinde ön ek, sonek veya her ikisi de olabilir (ör. my-app-*-prod
).
Joker karakter ve yakalama referansı
Cloud Functions (2. nesil) ve Realtime Database ile ref
ve instance
belirtilirken bir kalıp kullanılabilir. Her tetikleyici arayüzünde, işlev kapsamını belirlemek için aşağıdaki seçenekler bulunur:
ref değerini belirtme |
instance değerini belirtme |
Davranış |
---|---|---|
Tekli (/foo/bar ) |
Belirtilmiyor | İşleyiciyi işlev bölgesindeki tüm örneklere yönlendirir. |
Tekli (/foo/bar ) |
Tekli (‘my-new-db' ) |
İşleyiciyi, işlev bölgesindeki belirli bir örneğe yönlendirir. |
Tekli (/foo/bar ) |
Desen (‘inst-prefix*' ) |
İşleyiciyi, işlev bölgesindeki kalıpla eşleşen tüm örneklere yönlendirir. |
Desen (/foo/{bar} ) |
Belirtilmiyor | İşleyiciyi işlev bölgesindeki tüm örneklere yönlendirir. |
Desen (/foo/{bar} ) |
Tekli (‘my-new-db' ) |
İşleyiciyi, işlev bölgesindeki belirli bir örneğe yönlendirir. |
Desen (/foo/{bar} ) |
Desen (‘inst-prefix*' ) |
İşleyiciyi, işlev bölgesindeki kalıpla eşleşen tüm örneklere yönlendirir. |
Etkinlik verilerini işleme
Bir Realtime Database etkinliği tetiklendiğinde, işleyici işlevinize bir Event
nesnesi iletir.
Bu nesnenin, oluşturma ve silme etkinlikleri için oluşturulan veya silinen verilerin anlık görüntüsünü içeren bir data
mülkü vardır.
Bu örnekte işlev, başvurulan yolun verilerini alır, söz konusu konumdaki dizeyi büyük harfe dönüştürür ve değiştirilen bu 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
etkinlikleri için data
mülkü, tetikleyici etkinlikten önceki ve sonraki veri durumunu temsil eden iki anlık görüntü içeren bir Change
nesnesi.
Change
nesnesinde, etkinlik öncesinde Realtime Database'ye kaydedilenleri incelemenizi sağlayan bir before
özelliği ve etkinlik sonrasında verilerin durumunu temsil eden bir after
özelliği bulunur.
Örneğin, before
mülkü, işlevin metni yalnızca ilk oluşturulduğunda büyük harf kullanmasını 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)