Cloud Firestore tetikleyicileri

Cloud Functions ile, istemci kodunu güncellemeye gerek kalmadan Cloud Firestore'daki olayları işleyebilirsiniz. Sen aracılığıyla Bulut Firestore değişiklikler yapabilirsiniz DocumentSnapshot arabirimi veya üzeri Yönetici SDK .

Tipik bir yaşam döngüsünde bir Cloud Firestore işlevi aşağıdakileri yapar:

  1. Belirli bir belgedeki değişiklikleri 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. İçin onWrite veya onUpdate etkinlikleri, veri nesnesi önce ve olay tetikleyici sonra veri durumunu temsil iki enstantane içerir.

Firestore örneğinin konumu ile işlevin konumu arasındaki mesafe, önemli ağ gecikmesi oluşturabilir. Optimize performansı için, belirterek düşünün fonksiyon konumunu uygulanabilir nerede.

Cloud Firestore işlevi tetikleyicileri

Firebase SDK için Bulut İşlevleri bir ihraç functions.firestore belirli Bulut Firestore olaylara bağlı işleyicileri oluşturmanıza olanak sağlar nesnesi.

Etkinlik tipi Tetiklemek
onCreate Bir belgeye ilk kez yazıldığında tetiklenir.
onUpdate Bir belge zaten mevcut olduğunda ve herhangi bir değeri değiştiğinde tetiklenir.
onDelete Veri içeren bir belge silindiğinde tetiklenir.
onWrite Tetiklenir onCreate , onUpdate veya onDelete tetiklenir.

Eğer bir proje henüz Firebase için Bulut Fonksiyonlar için etkinleştirilmiş yoksa, o zaman okumak Yaz ve dağıtma İlk Fonksiyonlar: Başlarken configure ve Firebase projesi için Cloud İşlevleri kurdu.

Cloud Firestore tarafından tetiklenen işlevler yazma

Bir işlev tetikleyici tanımlayın

Bir Cloud Firestore tetikleyicisi tanımlamak için bir belge yolu ve bir olay türü belirtin:

Node.js

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

exports.myFunction = functions.firestore
  .document('my-collection/{docId}')
  .onWrite((change, context) => { /* ... */ });

Belge yollar, ya referans alabilir belirli bir belge ya da Joker .

Tek bir belge belirtin

Belirli bir dokümanın herhangi bir değişikliğin bir olayı tetiklemek istiyorsanız o zaman aşağıdaki işlevi kullanabilirsiniz.

Node.js

// Listen for any change on document `marie` in collection `users`
exports.myFunctionName = functions.firestore
    .document('users/marie').onWrite((change, context) => {
      // ... Your code here
    });

Joker karakterler kullanarak bir grup belge belirtin

Eğer böyle belli koleksiyonunda herhangi bir belge olarak belgelerin, bir grup için bir tetikleyici eklemek isterseniz, o zaman bir kullanma {wildcard} belge kimliği yerine:

Node.js

// Listen for changes in all documents in the 'users' collection
exports.useWildcard = functions.firestore
    .document('users/{userId}')
    .onWrite((change, context) => {
      // If we set `/users/marie` to {name: "Marie"} then
      // context.params.userId == "marie"
      // ... and ...
      // change.after.data() == {name: "Marie"}
    });

Bu örnekte, herhangi bir belge üzerinde herhangi bir alan olduğunda users değiştiğinde, denilen bir joker eşleşir userId .

Bir belge varsa users subcollections vardır ve bu subcollections' belgelerin birinde bir alan değiştiğinde, userId joker tetiklenmez.

Joker maçlar belge yolundan çıkarılan ve içine saklanır context.params . Açık koleksiyon veya belge kimliklerinin yerine istediğiniz kadar joker karakter tanımlayabilirsiniz, örneğin:

Node.js

// Listen for changes in all documents in the 'users' collection and all subcollections
exports.useMultipleWildcards = functions.firestore
    .document('users/{userId}/{messageCollectionId}/{messageId}')
    .onWrite((change, context) => {
      // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
      // context.params.userId == "marie";
      // context.params.messageCollectionId == "incoming_messages";
      // context.params.messageId == "134";
      // ... and ...
      // change.after.data() == {body: "Hello"}
    });

Olay Tetikleyicileri

Yeni bir belge oluşturulduğunda bir işlevi tetikleyin

Bir kullanarak yeni bir belge bir koleksiyon oluşturulur her zaman yangın bir işlev tetikleyebilir onCreate() bir ile işleyicisi joker . Bu örnek işlevi çağırır createUser yeni bir kullanıcı profili eklenir her zaman:

Node.js

exports.createUser = functions.firestore
    .document('users/{userId}')
    .onCreate((snap, context) => {
      // Get an object representing the document
      // e.g. {'name': 'Marie', 'age': 66}
      const newValue = snap.data();

      // access a particular field as you would any JS property
      const name = newValue.name;

      // perform desired operations ...
    });

Bir belge güncellendiğinde bir işlevi tetikleyin

Bir belge kullanılarak güncellenen olduğunda da ateşe bir işlev tetikleyebilir onUpdate() bir ile işlevini joker . Bu örnek işlevi çağırır updateUser kullanıcı profillerini değiştirirse:

Node.js

exports.updateUser = functions.firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      // Get an object representing the document
      // e.g. {'name': 'Marie', 'age': 66}
      const newValue = change.after.data();

      // ...or the previous value before this update
      const previousValue = change.before.data();

      // access a particular field as you would any JS property
      const name = newValue.name;

      // perform desired operations ...
    });

Bir belge silindiğinde bir işlevi tetikleyin

Bir belge kullanılarak silindiğinde Ayrıca bir işlev tetikleyebilir onDelete() bir ile işlevini joker . Bu örnek işlevi çağırır deleteUser bir kullanıcının kendi kullanıcı profili silen zaman:

Node.js

exports.deleteUser = functions.firestore
    .document('users/{userID}')
    .onDelete((snap, context) => {
      // Get an object representing the document prior to deletion
      // e.g. {'name': 'Marie', 'age': 66}
      const deletedValue = snap.data();

      // perform desired operations ...
    });

Bir belgedeki tüm değişiklikler için bir işlevi tetikleyin

Eğer varlık ateş etkinlik türüne umurumda değil, kullandığınız Bulut Firestore belgedeki tüm değişiklikleri dinleyebilirsiniz onWrite() bir ile işlevini joker . Bu örnek işlevi çağırır modifyUser bir kullanıcı oluşturulduğunda, güncellendiğinde veya silinirse:

Node.js

exports.modifyUser = functions.firestore
    .document('users/{userID}')
    .onWrite((change, context) => {
      // Get an object with the current document value.
      // If the document does not exist, it has been deleted.
      const document = change.after.exists ? change.after.data() : null;

      // Get an object with the previous document value (for update or delete)
      const oldDocument = change.before.data();

      // perform desired operations ...
    });

Veri Okuma ve Yazma

Bir işlev tetiklendiğinde, olayla ilgili verilerin anlık görüntüsünü sağlar. Olayı tetikleyen belgeden okumak veya belgeye yazmak için bu anlık görüntüyü kullanabilir veya veritabanınızın diğer bölümlerine erişmek için Firebase Admin SDK'sını kullanabilirsiniz.

Olay Verileri

Veri Okuma

Bir işlev tetiklendiğinde, güncellenmiş bir belgeden veri almak veya verileri güncellemeden önce almak isteyebilirsiniz. Sen kullanarak önceki veriler elde edebilirsiniz change.before.data() güncellemeden önce belge anlık görüntüsünü içeren,. Benzer şekilde, change.after.data() güncellemeden sonra belge anlık durumunu içerir.

Node.js

exports.updateUser2 = functions.firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      // Get an object representing the current document
      const newValue = change.after.data();

      // ...or the previous value before this update
      const previousValue = change.before.data();
    });

Diğer nesnelerde olduğu gibi özelliklere erişebilirsiniz. Alternatif olarak, kullanabileceğiniz get erişim belirli alanlara işlevi:

Node.js

// Fetch data using standard accessors
const age = snap.data().age;
const name = snap.data()['name'];

// Fetch data using built in accessor
const experience = snap.get('experience');

Veri Yazma

Her işlev çağrısı, Cloud Firestore veritabanınızdaki belirli bir belgeyle ilişkilendirilir. Bir şekilde bu belgeyi erişebilirler DocumentReference içinde ref işlevinize döndü anlık özelliği.

Bu DocumentReference gelir Bulut Firestore node.js SDK ve benzeri yöntemler içerir update() , set() ve remove() kolayca işlevini tetikleyen belgeyi değiştirebilir böylece.

Node.js

// Listen for updates to any `user` document.
exports.countNameChanges = functions.firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      // Retrieve the current and previous value
      const data = change.after.data();
      const previousData = change.before.data();

      // We'll only update if the name has changed.
      // This is crucial to prevent infinite loops.
      if (data.name == previousData.name) {
        return null;
      }

      // Retrieve the current count of name changes
      let count = data.name_change_count;
      if (!count) {
        count = 0;
      }

      // Then return a promise of a set operation to update the count
      return change.after.ref.set({
        name_change_count: count + 1
      }, {merge: true});
    });

Tetikleyici olayın dışındaki veriler

Bulut İşlevleri, güvenilir bir ortamda yürütülür; bu, projenizde hizmet hesabı olarak yetkilendirildikleri anlamına gelir. Sen okur ve kullanan yazar gerçekleştirebilirsiniz Firebase Yönetici SDK'yı :

Node.js

const admin = require('firebase-admin');
admin.initializeApp();

const db = admin.firestore();

exports.writeToFirestore = functions.firestore
  .document('some/doc')
  .onWrite((change, context) => {
    db.doc('some/otherdoc').set({ ... });
  });

sınırlamalar

Cloud Functions için Cloud Firestore tetikleyicileri için aşağıdaki sınırlamalara dikkat edin:

  • Sipariş garanti edilmez. Hızlı değişiklikler, beklenmedik bir sırada işlev çağrılarını tetikleyebilir.
  • Olaylar en az bir kez teslim edilir, ancak tek bir olay birden çok işlev çağrısına neden olabilir. Tam-once mekaniği ve yazma bağlı kaçının İdempotent fonksiyonları .
  • Bulut Fonksiyonlar için Bulut Firestore tetikleyiciler yalnızca kullanılabilir yerel modda Bulut Firestore . Datastore modunda Cloud Firestore için kullanılamaz.