Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Veritabanı Tetikleyicileri

Cloud Functions ile, istemci kodunu güncellemeye gerek kalmadan Firebase Realtime Database'deki olayları işleyebilirsiniz. Cloud Functions, Realtime Database işlemlerini tam yönetici ayrıcalıklarıyla çalıştırmanıza olanak tanır ve Realtime Database'deki her değişikliğin ayrı ayrı işlenmesini sağlar. Sen aracılığıyla Firebase Gerçek Zamanlı Veri Tabanı değişiklikler yapabilirsiniz DataSnapshot veya üzeri Yönetici SDK .

Tipik bir yaşam döngüsünde, bir Firebase Realtime Database işlevi aşağıdakileri yapar:

  1. Belirli bir Gerçek Zamanlı Veritabanı konumunda değişiklik yapılmasını bekler.
  2. Tetikleyiciler bir olay meydana gelir ve gerçekleştirdiği onun görevleri sırasında (bkz ben? Bulut Fonksiyonlar ile neler yapabilirsiniz? Kullanım durumları örnekleri için).
  3. Belirtilen belgede depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır.

Gerçek Zamanlı Veritabanı işlevini tetikleyin

İle Gerçek Zamanlı Veri Tabanı olaylar için yeni fonksiyonlar oluşturun functions.database . İşlevin ne zaman tetikleneceğini kontrol etmek için olay işleyicilerinden birini belirtin ve olayları dinleyeceği Gerçek Zamanlı Veritabanı yolunu belirtin.

Olay işleyicisini ayarlayın

İşlevler, Gerçek Zamanlı Veritabanı olaylarını iki özgüllük düzeyinde işlemenize olanak tanır; özel olarak yalnızca oluşturma, güncelleme veya silme olaylarını dinleyebilir veya herhangi bir yol değişikliğini dinleyebilirsiniz. Cloud Functions, Realtime Database için şu olay işleyicileri destekler:

  • onWrite() , veri oluşturulduğunda, güncelleştirilmiş veya Gerçek Zamanlı Veritabanında silindi hangi tetikler.
  • onCreate() yeni veri Gerçek Zamanlı Veritabanı oluşturulur tetikleyiciler.
  • onUpdate() veri Gerçek Zamanlı Veritabanında güncellenir tetikleyiciler.
  • onDelete() veri Gerçek Zamanlı veritabanından silinir tetikleyiciler.

Örneği ve yolu belirtin

Kontrol ne zaman ve nerede fonksiyonu tetiklemesi gerektiğini, çağrı için ref(path) bir yol belirtin ve isteğe sahip Gerçek Zamanlı Veri Tabanı örneğini belirtmek için instance('INSTANCE_NAME') . Bir örnek belirtmezseniz işlev, Firebase projesi için varsayılan Gerçek Zamanlı Veritabanı örneğine dağıtılır. Örneğin:

  • Gerçek Zamanlı Veri Tabanı örneğini Standart: functions.database.ref('/foo/bar')
  • Örnek "my-app-db-2" adlı: functions.database.instance('my-app-db-2').ref('/foo/bar')

Bu yöntemler, işlevinizi Realtime Database örneğinde belirli bir yoldaki yazmaları işlemeye yönlendirir. Yol teknik özellikleri kendisinin aşağısında meydana yazma dahil bir yol, dokunma bütün yazma maç. Eğer gibi işlev için yolu belirlerseniz /foo/bar , bu konumların her ikisi de olayları eşleşir:

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

Her iki durumda da, bir olay olarak Firebase, yorumlayan oluşur /foo/bar ve olay veri eski ve yeni veri içeren /foo/bar . 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 yalnızca mümkün olan en derin düzeyde veri isteyin.

Bir yol bileşenini, onu süslü parantezlerle çevreleyerek joker karakter olarak belirtebilirsiniz; ref('foo/{bar}') herhangi çocuğu eşleşir /foo . Bu joker yolu bileşenlerin değerleri içinde mevcuttur EventContext.params sizin fonksiyonunun nesne. Bu örnekte, bir değer olarak kullanılabilir context.params.bar .

Joker karakterli yollar, tek bir yazma işleminden birden çok olayla eşleşebilir. bir ekleme

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

yolunu maçları "/foo/{bar}" İki kez: bir kez "hello": "world" ve tekrar ile "firebase": "functions" .

Olay verilerini işle

Gerçek Zamanlı Veri Tabanı olayını işlerken, döndürülen veri nesnesi bir olan DataSnapshot . İçin onWrite veya onUpdate olaylar, ilk parametre olan Change öncesinde ve tetikleme olaydan sonra veri durumunu temsil eden iki enstantane içeren nesne. İçin onCreate ve onDelete olaylar, döndürülen veri nesnesi oluşturulduğunda veya silinen verilerin anlık görüntüsüdür.

Bu örnekte, işlev olarak belirtilen yolu için anlık alır snap veritabanına dize değiştirilmiş olduğu, büyük harfe bu konumda dize dönüştürür ve yazma:

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = snapshot.val();
      functions.logger.log('Uppercasing', context.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 snapshot.ref.parent.child('uppercase').set(uppercase);
    });

Kullanıcı kimlik doğrulama bilgilerine erişme

Gönderen EventContext.auth ve EventContext.authType , bir işlev tetikleyen kullanıcı için, izinleri dahil kullanıcı bilgilerini erişebilir. Bu, güvenlik kurallarını uygulamak için yararlı olabilir ve işlevinizin kullanıcının izin düzeyine göre farklı işlemleri tamamlamasına olanak tanır:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

exports.simpleDbFunction = functions.database.ref('/path')
    .onCreate((snap, context) => {
      if (context.authType === 'ADMIN') {
        // do something
      } else if (context.authType === 'USER') {
        console.log(snap.val(), 'written by', context.auth.uid);
      }
    });

Ayrıca, bir kullanıcının "kimliğine bürünmek" ve kullanıcı adına yazma işlemleri gerçekleştirmek için kullanıcı kimlik doğrulama bilgilerinden yararlanabilirsiniz. Eşzamanlılık sorunlarını önlemek için uygulama örneğini aşağıda gösterildiği gibi sildiğinizden emin olun:

exports.impersonateMakeUpperCase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snap, context) => {
      const appOptions = JSON.parse(process.env.FIREBASE_CONFIG);
      appOptions.databaseAuthVariableOverride = context.auth;
      const app = admin.initializeApp(appOptions, 'app');
      const uppercase = snap.val().toUpperCase();
      const ref = snap.ref.parent.child('uppercase');

      const deleteApp = () => app.delete().catch(() => null);

      return app.database().ref(ref).set(uppercase).then(res => {
        // Deleting the app is necessary for preventing concurrency leaks
        return deleteApp().then(() => res);
      }).catch(err => {
        return deleteApp().then(() => Promise.reject(err));
      });
    });

Önceki değeri okuma

Change nesne vardır before Etkinlikten önce Gerçek Zamanlı Veri Tabanına kaydedilmiş ne incelemek sağlayan özellik. before mülkiyet döner bir DataSnapshot burada tüm yöntemler (örneğin, val() ve exists() ) önceki değerine karşılık gelir. Orijinal kullanarak ya tekrar yeni bir değer okuyabilir DataSnapshot veya okuma after mülk. Herhangi üzerindeki bu özellik Change başka bir şeydir DataSnapshot bir olay oldu sonra verilerin durumunu temsil eder.

Örneğin, before mülk ilk oluşturulduğunda emin işlev yalnızca metin büyük harfler yapmak için kullanılabilir:

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onWrite((change, context) => {
      // Only edit data when it is first created.
      if (change.before.exists()) {
        return null;
      }
      // Exit when the data is deleted.
      if (!change.after.exists()) {
        return null;
      }
      // Grab the current value of what was written to the Realtime Database.
      const original = change.after.val();
      console.log('Uppercasing', context.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 change.after.ref.parent.child('uppercase').set(uppercase);
    });