Firebase is back at Google I/O on May 10! Register now

Gerçek Zamanlı Veritabanı tetikleyicileri

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Tipik bir yaşam döngüsünde bir Firebase Gerçek Zamanlı Veritabanı işlevi aşağıdakileri yapar:

  1. Belirli bir Gerçek Zamanlı Veritabanı yolundaki değişiklikleri bekler.
  2. Bir olay meydana geldiğinde tetiklenir ve görevlerini yerine getirir.
  3. Bu yolda depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır.

Firebase Realtime Database'de veritabanı düğümlerinin yazılmasına, oluşturulmasına, güncellenmesine veya silinmesine yanıt olarak bir işlevi tetikleyebilirsiniz.

Firebase Gerçek Zamanlı Veritabanı değişikliklerinde bir işlevi tetikleyin

Firebase Gerçek Zamanlı Veritabanı olaylarını işleyen bir işlev oluşturmak için firebase-functions/v2/database alt paketini kullanın. İşlevin ne zaman tetikleneceğini kontrol etmek için olay işleyicilerinden birini belirtin ve olayları dinleyeceği Gerçek Zamanlı Veritabanı yolunu belirtin.

İşlev konumunun ayarlanması

Gerçek Zamanlı Veritabanı örneğinin konumu ile işlevin konumu arasındaki mesafe, önemli ağ gecikmesi oluşturabilir. Ayrıca, bölgeler arasındaki uyumsuzluk dağıtım hatasına neden olabilir. Bu durumlardan kaçınmak için işlev konumunu , veritabanı örnek konumuyla eşleşecek şekilde belirtin.

Gerçek Zamanlı Veritabanı olaylarını işleme

İşlevler, Gerçek Zamanlı Veritabanı olaylarını iki düzeyde belirlilik düzeyinde işlemenize olanak tanır; yalnızca yazma, oluşturma, güncelleme veya silme olaylarını özel olarak dinleyebilir veya herhangi bir tür değişikliği bir referansta dinleyebilirsiniz.

Gerçek Zamanlı Veritabanı olaylarına yanıt vermek için bu işleyiciler mevcuttur:

  • onValueWritten() Yalnızca veriler Gerçek Zamanlı Veritabanında yazıldığında tetiklenir.
  • onValueCreated() Yalnızca veriler Gerçek Zamanlı Veritabanında oluşturulduğunda tetiklenir.
  • onValueUpdated() Yalnızca veriler Gerçek Zamanlı Veritabanında güncellendiğinde tetiklenir.
  • onValueDeleted() Yalnızca Gerçek Zamanlı Veritabanındaki veriler silindiğinde tetiklenir.

Örneği ve yolu belirtin

İşlevinizin ne zaman ve nerede tetiklenmesi gerektiğini kontrol etmek için işlevinizi bir yolla ve isteğe bağlı olarak bir Gerçek Zamanlı Veritabanı örneğiyle yapılandırın. Bir örnek belirtmezseniz işlev, işlev bölgesindeki tüm Gerçek Zamanlı Veritabanı örneklerine dağıtılır. Aynı bölgedeki örneklerin seçili bir alt kümesine konuşlandırmak için bir Gerçek Zamanlı Veritabanı örnek modeli de belirtebilirsiniz.

Örneğin, örnek olarak onValueWritten() kullanılarak:

# 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) => {
    // …
  }
);

Bu parametreler, işlevinizi Gerçek Zamanlı Veritabanı örneği içinde belirli bir yoldaki yazmaları işlemeye yönlendirir.

Yol belirtimleri, altında herhangi bir yerde gerçekleşen yazmalar da dahil olmak üzere bir yola temas eden tüm yazma işlemleriyle eşleşir. İşlevinizin yolunu /foo/bar olarak ayarlarsanız, bu konumların her ikisindeki olaylarla eşleşir:

 /foo/bar
 /foo/bar/baz/really/deep/path

Her iki durumda da Firebase, olayın /foo/bar adresinde gerçekleştiğini ve etkinlik verilerinin /foo/bar adresindeki eski ve yeni verileri içerdiğini yorumlar. Olay verileri büyük olabilirse, veritabanınızın köküne yakın tek bir işlev yerine daha derin yollarda birden çok işlev kullanmayı düşünün. En iyi performans için, verileri yalnızca mümkün olan en derin düzeyde isteyin.

Joker karakter oluşturma ve yakalama

Yakalamak için {key} , {key=*} , {key=prefix*} , {key=*suffix} kullanabilirsiniz. * , prefix* , *suffix . Not: ** RTDB'nin desteklemediği çok bölümlü joker karakteri temsil eder. Bkz . Yol modellerini anlama .

Yol joker karakteri. Bir yol bileşenini joker karakter olarak belirleyebilirsiniz:

  • Yıldız işareti kullanarak, * . Örneğin, foo/* foo/ altındaki düğüm hiyerarşisinin bir düzeyindeki herhangi bir çocukla eşleşir.
  • Tam olarak yıldız işareti içeren bir segment kullanarak, * . Örneğin, foo/app*-us foo/ altındaki tüm alt segmentleri app ön eki ve -us son ekiyle eşleştirir.

Joker karakterler içeren yollar, örneğin tek bir yazmadan birden çok olayla eşleşebilir. bir ekleme

{
  "foo": {
    "hello": "world",
    "firebase": "functions"
  }
}

"/foo/*" yolunu iki kez eşleştirir: bir kez "hello": "world" ile ve tekrar "firebase": "functions" ile.

Yol yakalama. İşlev kodunuzda kullanılacak adlandırılmış değişkenlerdeki yol eşleşmelerini yakalayabilirsiniz (örneğin /user/{uid} , /user/{uid=*-us} ).

Yakalama değişkenlerinin değerleri, işlevinizin database.DatabaseEvent.params nesnesinde bulunur.

Örnek joker karakter oluşturma. Joker karakter kullanarak bir örnek bileşeni de belirleyebilirsiniz. Örnek bir joker karakter önek, sonek veya her ikisine birden sahip olabilir (örn. 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 tetikleme arabirimi, bir işlevi kapsam belirlemek için aşağıdaki seçeneklere sahip olacaktır:

ref belirtme instance belirtme Davranış
Tek ( /foo/bar ) belirtmemek İşlev bölgesindeki tüm örneklere kapsam işleyicisi.
Tek ( /foo/bar ) Tek ( 'my-new-db' ) İşleyiciyi işlev bölgesindeki belirli bir örneğe kapsamlar.
Tek ( /foo/bar ) Desen ( 'inst-prefix*' ) Kapsam işleyicisini, işlev bölgesindeki modelle eşleşen tüm örneklere yönlendirir.
Kalıp ( /foo/{bar} ) belirtmemek İşlev bölgesindeki tüm örneklere kapsam işleyicisi.
Kalıp ( /foo/{bar} ) Tek ( 'my-new-db' ) İşleyiciyi işlev bölgesindeki belirli bir örneğe kapsamlar.
Kalıp ( /foo/{bar} ) Desen ( 'inst-prefix*' ) Kapsam işleyicisini, işlev bölgesindeki modelle eşleşen tüm örneklere yönlendirir.

Olay verilerini işleme

Bir Gerçek Zamanlı Veritabanı olayını işlerken, döndürülen veri nesnesi bir DataSnapshot .

onValueWritten veya onValueUpdated olayları için ilk parametre, tetikleyici olaydan önceki ve sonraki veri durumunu temsil eden iki anlık görüntü içeren bir Change nesnesidir.

onValueCreated ve onValueDeleted olayları için döndürülen veri nesnesi, oluşturulan veya silinen verilerin anlık görüntüsüdür.

Bu örnekte işlev, belirtilen foo/bar yolu için anlık görüntüyü snap olarak alır, o konumdaki dizeyi büyük harfe dönüştürür ve değiştirilmiş 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
export makeuppercase = onValueCreated("foo/bar", (event) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      functions.logger.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.ref.parent.child('uppercase').set(uppercase);
    });

Önceki değeri okuma

Change nesnesi, olaydan önce Realtime Database'e neyin kaydedildiğini incelemenizi sağlayan bir before özelliğine sahiptir. before özelliği, tüm yöntemlerin (örneğin, val() ve exists() ) önceki değere başvurduğu bir DataSnapshot döndürür. Orijinal DataSnapshot kullanarak veya after özelliğini okuyarak yeni değeri tekrar okuyabilirsiniz. Herhangi bir Change bu özellik, olay gerçekleştikten sonra verilerin durumunu temsil eden başka bir DataSnapshot .

Örneğin, fonksiyonun ilk oluşturulduğunda metni yalnızca büyük harfle yazmasını sağlamak için before özelliği 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);
        });