Bulut Fonksiyonlarıyla Veri Bağlantısını Genişletin

Cloud Functions for Firebase ile Firebase Data Connect'deki etkinlikleri yönetebilirsiniz. Cloud Functions, hizmetinizde bir mutasyonun yürütülmesi gibi etkinliklere yanıt olarak sunucu tarafı kodu çalıştırmanıza olanak tanır.Data Connect Bu sayede kendi sunucularınızı dağıtmadan özel mantık ekleyebilirsiniz.

Yaygın kullanım alanları

  • Veri Senkronizasyonu: Bir mutasyon gerçekleştikten sonra verileri diğer sistemlerle (ör. Cloud Firestore, BigQuery veya harici API'ler) kopyalayın ya da senkronize edin.

  • Asenkron İş Akışları: Veritabanı değişikliğinden sonra görüntü işleme veya veri toplama gibi uzun süren süreçleri başlatın.

  • Kullanıcı etkileşimi: Uygulamanızda belirli bir mutasyon etkinliğinden (ör. hesap oluşturma) sonra kullanıcılara e-posta veya Cloud Messaging bildirim gönderin.

Data Connect değişikliğinde bir işlevi tetikleme

Data Connect Olay işleyiciyi onMutationExecuted kullanarak bir Data Connect mutasyon yürütüldüğünde onMutationExecuted işlev tetikleyebilirsiniz. Bu tetikleyici, mutasyon yürütüldüğünde gerçekleşir.

Temel bir mutasyon etkinliği işlevi

Aşağıdaki temel örnek, Data Connect hizmetinizde yürütülen tüm mutasyonların ayrıntılarını günlüğe kaydeden bir işlevdir:

Node.js

import { onMutationExecuted } from "firebase-functions/dataconnect";
import { logger } from "firebase-functions";

export const logMutation = onMutationExecuted(
  {
    /* Trigger on all mutations, spanning all services and connectors
       in us-central1 */
  },
  (event) => {
    logger.info("A mutation was executed!", {
      data: event.data,
    });
  }
);

Python

from firebase_functions import dataconnect_fn, logger

@dataconnect_fn.on_mutation_executed()
def log_mutation(event: dataconnect_fn.Event):
  logger.info("A mutation was executed!", event.data)

Projenizdeki tüm mutasyonları tetiklediğinizde tetikleyici işleyicide herhangi bir mutasyon gerçekleştirmemelisiniz. Aksi takdirde sonsuz döngüye neden olursunuz. Bir etkinlik tetikleyicisinde mutasyon gerçekleştirmek istiyorsanız aşağıda açıklanan filtreleme seçeneklerini kullanın ve mutasyonun kendisini tetiklemediğinden emin olun.

İşlev konumunu ayarlama

Etkinliklerin işlevi tetiklemesi için işlev konumu, Data Connect hizmet konumuyla eşleşmelidir. Varsayılan olarak işlev bölgesi us-central1'dır.

Node.js

import { onMutationExecuted } from "firebase-functions/dataconnect";

export const onMutationRegionOption = onMutationExecuted(
  {
    region: "europe-west1"  // Set if Data Connect service location is not us-central1
  },
  (event) => { /* ... */ }
);

Python

@dataconnect_fn.on_mutation_executed(
  region="europe-west1"  # Set if Data Connect service location is not us-central1
)
def mutation_executed_handler_region_option(event: dataconnect_fn.Event):
  pass

Etkinlikleri filtrele

onMutationExecuted işleyicisi, olayları belirli niteliklere göre filtreleme seçenekleriyle yapılandırılabilir. Bu, yalnızca belirli mutasyonlar için işlevinizi tetiklemek istediğinizde kullanışlıdır.

service, connector ve operation ile filtreleyebilirsiniz:

Node.js

import { onMutationExecuted } from "firebase-functions/dataconnect";
import { logger } from "firebase-functions";

// Trigger this function only for the CreateUser mutation
// in the users connector of the myAppService service.
export const onUserCreate = onMutationExecuted(
  {
    service: "myAppService",
    connector: "users",
    operation: "CreateUser",
  },
  (event) => {
    logger.info("A new user was created!", event.data);
    // Add logic here: for example, sending a welcome email.
  }
);

Python

from firebase_functions import dataconnect_fn, logger

@dataconnect_fn.on_mutation_executed(
  service="myAppService",
  connector="users",
  operation="CreateUser"
):
def on_user_create(event: dataconnect_fn.Event):
  logger.info("A new user was created!", event.data)

Joker karakterler ve yakalama grupları

Tetikleyicilerinizi birden fazla değere göre filtrelemek için joker karakterler ve yakalama grupları kullanabilirsiniz. Yakalanan tüm gruplar event.params içinde kullanılabilir. Daha fazla bilgi için Yol kalıplarını anlama başlıklı makaleyi inceleyin.

Örnekler:

Node.js

import { onMutationExecuted } from "firebase-functions/dataconnect";

// Trigger on all operations that match the pattern `User*`, on any service and
// connector.
export const onMutationWildcards = onMutationExecuted(
  {
    operation: "User*",
  },
  (event) => {}
);

// Trigger on all operations that match the pattern `User*`, on any service and
// connector. Capture the operation name in the variable `op`.
export const onMutationCaptureWildcards = onMutationExecuted(
  {
    operation: "{op=User*}",
  },
  (event) => {
    // `event.params.op` contains the operation name.
  }
);

// Trigger on all operations on the service `myAppService`. Capture the
// operation name in the variable `operation`.
export const onMutationCaptures = onMutationExecuted(
  {
    service: "myAppService",
    operation: "{operation}",
  },
  (event) => {
    // `event.params.operation` contains the operation name.
  }
);

Python

from firebase_functions import dataconnect_fn

# Trigger on all operations that match the pattern `User*`, on any service and
# connector.
@dataconnect_fn.on_mutation_executed(
  operation="User*"
)
def on_mutation_wildcards(event: dataconnect_fn.Event):
  pass

# Trigger on all operations that match the pattern `User*`, on any service and
# connector. Capture the operation name in the variable `op`.
@dataconnect_fn.on_mutation_executed(
  operation="{op=User*}"
)
def on_mutation_capture_wildcards(event: dataconnect_fn.Event):
  # `event.params["op"]` contains the operation name.
  pass

# Trigger on all operations on the service `myAppService`. Capture the
# operation name in the variable `operation`.
@dataconnect_fn.on_mutation_executed(
  service="myAppService",
  operation="{operation}"
)
def on_mutation_captures(event: dataconnect_fn.Event):
  # `event.params["operation"]` contains the operation name.
  pass

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

Olayı tetikleyen sorumluya ait kullanıcı kimlik doğrulama bilgilerine erişebilirsiniz. Kimlik doğrulama bağlamında mevcut veriler hakkında daha fazla bilgi için Kimlik Doğrulama Bağlamı bölümüne bakın.

Aşağıdaki örnek, kimlik doğrulama bilgilerinin nasıl alınacağını göstermektedir:

Node.js

import { onMutationExecuted } from "firebase-functions/dataconnect";

export const onMutation = onMutationExecuted(
  { operation: "MyMutation" },
  (event) => {
    // mutationExecuted event provides authType and authId:
    // event.authType
    // event.authId
  }
);

Python

from firebase_functions import dataconnect_fn

@dataconnect_fn.on_mutation_executed(operation="MyMutation")
def mutation_executed_handler(event: dataconnect_fn.Event):
  # mutationExecuted event provides auth_type and auth_id, which are accessed as follows
  # event.auth_type
  # event.auth_id
  pass

Yetkilendirme türü ve yetkilendirme kimliği aşağıdaki şekilde doldurulur:

Mutasyon şu kişi tarafından başlatıldı: authtype yetkili
Kimliği doğrulanmış son kullanıcı app_user Firebase Yetkilendirme belirteci UID'si
Kimliği doğrulanmamış son kullanıcı unauthenticated boş
Son kullanıcıyı taklit eden Yönetici SDK'sı app_user Taklit edilen kullanıcının Firebase Yetkilendirme belirteci UID'si
Admin SDK, kimliği doğrulanmamış bir isteğin kimliğine bürünüyor unauthenticated boş
Tam izinlere sahip Yönetici SDK'sı admin boş

Etkinlik verilerine erişme

İşlevinize iletilen CloudEvent nesnesi, işlevi tetikleyen etkinlik hakkında bilgiler içerir.

Etkinlik özellikleri

Özellik Tür Açıklama
id string Etkinliğin benzersiz tanımlayıcısı.
source string Etkinliği oluşturan bağlayıcı kaynağı (örneğin, //firebasedataconnect.googleapis.com/projects/*/locations/*/services/*/connectors/*).
specversion string CloudEvents spesifikasyon sürümü (ör. "1.0").
type string Etkinliğin türü: google.firebase.dataconnect.connector.v1.mutationExecuted.
time string Etkinliğin oluşturulduğu zamanın zaman damgası (ISO 8601 biçimi).
subject string İsteğe bağlı. Etkinlik bağlamıyla ilgili ek bilgiler (ör. işlem adı).
params object Yakalanan yol kalıplarının haritası.
authType string Etkinliği tetikleyen asıl türünü temsil eden bir enum.
authId string Etkinliği tetikleyen asıl öğenin benzersiz tanımlayıcısı.
data MutationEventData Data Connect etkinliğinin yükü. Sonraki bölüme bakın.

Veri yükü

MutationEventData nesnesi, Data Connect etkinliğinin yükünü içerir:

{
  // ...
  "authType": // ...
  "data": {
    "payload": {
      "variables": {
        "userId": "user123",
        "updateData": {
          "displayName": "New Name"
        }
      },
      "data": {
        "updateUser": {
          "id": "user123",
          "displayName": "New Name",
          "email": "user@example.com"
        }
      },
      "errors": []
    }
  }
}
  • payload.variables: Mutasyona iletilen değişkenleri içeren bir nesne.
  • payload.data: Mutasyon tarafından döndürülen verileri içeren bir nesne.
  • payload.errors: Mutasyonun yürütülmesi sırasında oluşan hataların dizisi. Değişiklik başarılı olduysa bu dizi boş olur.

Örnek

Değişiklik değişkenlerine ve döndürülen verilere nasıl erişebileceğiniz aşağıda açıklanmıştır:

Node.js

import { onMutationExecuted } from "firebase-functions/dataconnect";
import { logger } from "firebase-functions";

export const processNewUserData = onMutationExecuted(
  {
    "service": "myAppService",
    "connector": "users",
    "operation": "CreateUser",
  },
  (event) => {
    // The variables passed to the mutation
    const mutationVariables = event.data.payload.variables;

    // The data returned by the mutation
    const returnedData = event.data.payload.data;

    logger.info("Processing mutation with variables:", mutationVariables);
    logger.info("Mutation returned:", returnedData);

    // ... your custom logic here
  }
);

Python

from firebase_functions import dataconnect_fn, logger

@dataconnect_fn.on_mutation_executed(
  service="myAppService",
  connector="users",
  operation="CreateUser"
):
def process_new_user_data(event: dataconnect_fn.Event):
  # The variables passed to the mutation
  mutation_vars = event.data.payload.variables
  # The data returned by the mutation
  returned_data = event.data.payload.data

  logger.info("Processing mutation with variables:", mutationVariables)
  logger.info("Mutation returned", returnedData)

  # ... your custom logic here

Cloud Firestore veya Realtime Database gibi diğer bazı veritabanı tetikleyicilerinin aksine, Data Connect etkinliğinin verilerin "öncesine" ait bir anlık görüntüsünü sağlamadığını unutmayın. Data Connect, temel veritabanına istekleri proxy'lediği için verilerin "önceki" anlık görüntüsü işlemsel olarak alınamaz. Bunun yerine, mutasyona gönderilen bağımsız değişkenlere ve mutasyon tarafından döndürülen verilere erişebilirsiniz.

Bunun bir sonucu olarak, bir etkinlik tetikleyicisinin aynı etkinliği tetiklediği sonsuz döngüleri önlemek için "önce" ve "sonra" anlık görüntülerini karşılaştırma stratejisini kullanamazsınız. Bir mutasyon etkinliği tarafından tetiklenen bir işlevden mutasyon gerçekleştirmeniz gerekiyorsa etkinlik filtrelerini kullanın ve hiçbir mutasyonun dolaylı olarak bile kendisini tetikleyemeyeceğinden emin olun.