Realtime Database tetikleyicileri


Cloud Functions ile etkinlikleri İstemci kodunun güncellenmesine gerek kalmadan Firebase Realtime Database. Cloud Functions, Realtime Database işlemlerini yöneticilerle birlikte çalıştırmanızı sağlar ve Realtime Database'de yapılan her değişikliğin işlenmesini ayrı ayrı düzenleyebilirsiniz. Firebase Realtime Database'de değişiklik yapmak için şurayı kullanabilirsiniz: DataSnapshot Yönetici SDK'sı üzerinden kullanabilirsiniz.

Firebase Realtime Database işlevi tipik bir yaşam döngüsünde şu işlemleri yapar:

  1. Belirli bir Realtime Database konumunda yapılan değişiklikleri bekler.
  2. Bir etkinlik gerçekleştiğinde tetiklenir ve görevlerini yerine getirir (bkz. Ne yapabilirim? Cloud Functions? ile ilgili kullanım alanı) ekleyebilirsiniz.
  3. Depolanan verilerin anlık görüntüsünü içeren bir veri nesnesi alır belirtilen dokümanda olması gerekir.

Realtime Database işlevini tetikleme

Realtime Database etkinlikleri için yeni işlevler oluşturma functions.database ile. Alıcı: işlevin ne zaman tetikleneceğini kontrol edin, etkinlik işleyicilerden birini belirtin ve etkinlikleri dinleyacağı Realtime Database yolunu belirtin.

Etkinlik işleyiciyi ayarlama

İşlevler, Realtime Database etkinliklerini iki belirlilik düzeyinde yönetmenizi sağlar: sadece içerik oluşturma, güncelleme ve veya bir yoldaki herhangi bir değişikliği dinleyebilirsiniz. Cloud Functions, Realtime Database için şu etkinlik işleyicileri destekler:

  • onWrite(), Realtime Database'de veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetiklenir.
  • onCreate(), Realtime Database'de yeni veri oluşturulduğunda tetiklenir.
  • onUpdate(), Realtime Database'de veriler güncellendiğinde tetiklenir .
  • onDelete(), veriler Realtime Database'den silindiğinde tetiklenir .

Örneği ve yolu belirtin

İşlevinizin ne zaman ve nerede tetikleneceğini kontrol etmek için ref(path) çağrısı yapın seçeneğini kullanın ve isteğe bağlı olarak bir Realtime Database örneği belirtin instance('INSTANCE_NAME') ile. Google bir örnek belirtirseniz işlev, şunun için varsayılan Realtime Database örneğine dağıtılır: Firebase projesini. Örneğin:

  • Varsayılan Realtime Database örneği: functions.database.ref('/foo/bar')
  • "my-app-db-2" adlı örnek: functions.database.instance('my-app-db-2').ref('/foo/bar')

Bu yöntemler, işlevinizi içindeki belirli bir yoldaki yazma işlemlerini işlemesi için yönlendirir örneğidir. Yol özellikleri, bir yola dokunan tüm yazmalarla eşleşir, yazmalar dahil daha iyi olur. Yolun belirli bir /foo/bar olarak fonksiyonunuz için şu 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 olduğunda gerçekleştiğini ve Etkinlik verilerinde de /foo/bar itibarıyla eski ve yeni veriler. Etkinlik verileri büyükse tek bir işlev yerine daha derin yollarda birden çok işlev kullanmayı düşünün işlevini kullanın. En iyi performans için yalnızca istekte bulunun mümkün olan en derin düzeyde veri toplar.

Bir yol bileşenini kıvrık şekilde sarmalayarak joker karakter olarak belirtebilirsiniz parantezler; ref('foo/{bar}'), /foo öğesinin herhangi bir alt öğesiyle eşleşir. Bu değerlerin joker karakter yol bileşenleri, EventContext.params işlevinizin nesnesi. Bu örnekte, değer context.params.bar

Joker karakter içeren yollar, tek bir yazma işleminde birden fazla etkinlikle eşleşebilir. Ek

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

"/foo/{bar}" yoluyla bir kez "hello": "world" ile iki kez eşleşir ve "firebase": "functions" ile tekrar deneyin.

Etkinlik verilerini işleme

Bir Realtime Database etkinliği işlenirken döndürülen veri nesnesi DataSnapshot. onWrite veya onUpdate etkinlikleri için ilk parametre, iki anlık görüntü içeren bir Change nesnesi önceki veri durumunu temsil eden ve tetikleyici etkinlikten sonra gösterilir. onCreate ve onDelete etkinlikleri 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 yol, ilgili 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
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

Kaynak: EventContext.auth ve EventContext.authType, erişebilirsiniz etkinliği tetikleyen kullanıcıya ait izinler dahil olmak üzere bir işlev olarak tanımlanır. Bu, güvenlik kurallarının zorunlu kılınması açısından işlevinizin, kullanıcının özelliklerine göre farklı işlemler gerçekleştirmesini izin düzeyi:

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, kullanıcı kimlik doğrulama bilgilerinden yararlanarak "başkasının kimliğini kullanabilirsiniz" kullanıcı kullanıcı adına yazma işlemleri gerçekleştirebilir. uygulama örneğini aşağıda gösterildiği gibi yükleyebilirsiniz:

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ğer okunuyor

Change nesnesi bir before BigQuery'den önce Realtime Database'e nelerin kaydedildiğini incelemenize olanak tanıyan unutmayın. before özelliği, tümünün geçerli olduğu bir DataSnapshot döndürür. yöntemleri (örneğin, val() ve exists()) önceki değere başvuruda bulunur. Yeni değeri orijinal DataSnapshot veya okuma after Herhangi bir Change üzerindeki bu mülk, değeri temsil eden başka bir DataSnapshot etkinlikten sonra verilerin durumunu gösterir.

Örneğin, before özelliği, işlevin yalnızca ilk oluşturulduğunda metni büyük harfle yazar:

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);
    });