Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Veritabanı Tetikleyicileri

Cloud Functions ile, istemci kodunu güncellemenize gerek kalmadan Firebase Realtime Database'deki olayları yönetebilirsiniz. Cloud Functions, Gerçek Zamanlı Veritabanı işlemlerini tam yönetici ayrıcalıklarıyla çalıştırmanıza olanak tanır ve Gerçek Zamanlı Veritabanında yapılan her değişikliğin ayrı ayrı işlenmesini sağlar. Firebase Realtime Database değişiklikleriniDataSnapshot veya Admin SDK aracılığıyla yapabilirsiniz.

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

  1. Belirli bir Gerçek Zamanlı Veritabanı konumundaki değişiklikleri bekler.
  2. Bir olay meydana geldiğinde ve görevlerini gerçekleştirdiğinde tetikler (kullanım örnekleri için Cloud Functions ile ne yapabilirim? Konusuna bakın).
  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şlemenizi sağlar; Özellikle yalnızca oluşturma, güncelleme veya silme olaylarını dinleyebilir veya bir yolda herhangi bir değişiklik olup olmadığını dinleyebilirsiniz. Cloud Functions, Realtime Database için şu olay işleyicilerini destekler:

  • Gerçek Zamanlı Veritabanında veri oluşturulduğunda, güncellendiğinde veya silindiğinde tetikleyen onWrite() .
  • Gerçek Zamanlı Veritabanında yeni veri oluşturulduğunda tetikleyen onCreate() .
  • onUpdate() Gerçek Zamanlı Veritabanında güncellendiğinde tetiklenen onUpdate() .
  • onDelete() Gerçek Zamanlı Veritabanından silindiğinde tetiklenen onDelete() .

Örneği ve yolu belirtin

İşlevinizin ne zaman ve nerede tetikleneceğini kontrol etmek için, bir yol belirtmek üzere ref(path) çağırın ve isteğe bağlı olarak instance('INSTANCE_NAME') bir Gerçek Zamanlı Veritabanı örneği belirtin. Bir örnek belirtmezseniz işlev, Firebase projesi için varsayılan Gerçek Zamanlı Veritabanı örneğine dağıtılır Örneğin:

  • Varsayılan Gerçek Zamanlı Veritabanı ö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 Gerçek Zamanlı Veritabanı örneğindeki belirli bir yoldaki yazmaları işlemeye yönlendirir. Yol özellikleri, altında herhangi bir yerde gerçekleşen yazmalar da dahil olmak üzere bir yola dokunan tüm yazmalarla eşleşir. İşlevinizin yolunu /foo/bar olarak ayarlarsanız, bu iki konumdaki olaylarla eşleşir:

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

Her iki durumda da Firebase, olayın /foo/bar ve olay verilerinin /foo/bar eski ve yeni verileri içerdiğini yorumlar. Olay verileri büyükse, 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 küme parantezleriyle çevreleyerek joker karakter olarak belirtebilirsiniz; ref('foo/{bar}') , /foo herhangi bir alt /foo eşleşir. Bu joker karakter yolu bileşenlerinin değerleri, işlevinizin EventContext.params nesnesinde mevcuttur. Bu örnekte değer, context.params.bar olarak mevcuttur.

Joker karakterli yollar, tek bir yazma ile birden çok olayı eşleştirebilir. Bir ek

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

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

Olay verilerini işleyin

Bir Gerçek Zamanlı Veritabanı olayını işlerken, döndürülen veri nesnesi birDataSnapshot . onWrite veya onUpdate olayları için ilk parametre, tetikleme olayından önceki ve sonraki veri durumunu temsil eden iki anlık görüntü içeren bir Change nesnesidir. İç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();
      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 snapshot.ref.parent.child('uppercase').set(uppercase);
    });

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

EventContext.auth ve EventContext.authType , bir işlevi tetikleyen kullanıcı için izinler dahil olmak üzere kullanıcı bilgilerine erişebilirsiniz. Bu, işlevinizin kullanıcının izin düzeyine bağlı olarak farklı işlemleri tamamlamasına izin vererek güvenlik kurallarını uygulamak için yararlı olabilir:

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ıyı "taklit etmek" 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 okumak

Change nesnesi, olaydan önce Realtime Database'e kaydedilenleri incelemenizi sağlayan bir before özelliğine sahiptir. 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 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, before özelliği, işlevin yalnızca ilk oluşturulduğunda metni büyük harflerle yazmasını sağlamak 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);
    });