Pemicu Firestore (generasi ke-2)
Anda dapat mengonfigurasi Cloud Functions agar dipicu oleh peristiwa di database Firestore. Setelah dipicu, fungsi Anda dapat membaca dan mengupdate database Firestore sebagai respons terhadap peristiwa ini melalui API Firestore dan library klien.
Dalam siklus proses umum, fungsi Firestore melakukan hal-hal berikut:
Menunggu perubahan pada dokumen tertentu.
Terpicu ketika suatu peristiwa terjadi dan menjalankan tugasnya.
Menerima objek data dengan snapshot dokumen yang terpengaruh. Untuk peristiwa
write
atauupdate
, objek data berisi snapshot yang mewakili status dokumen sebelum dan setelah peristiwa pemicuan.
Jenis peristiwa
Firestore mendukung peristiwa create
, update
, delete
, dan write
. Peristiwa write
mencakup semua perubahan pada dokumen.
Jenis peristiwa | Pemicu |
---|---|
google.cloud.firestore.document.v1.created (default) |
Dipicu saat dokumen ditulisi untuk pertama kalinya. |
google.cloud.firestore.document.v1.updated |
Dipicu saat dokumen sudah ada dan nilainya berubah. |
google.cloud.firestore.document.v1.deleted |
Dipicu saat dokumen yang memuat data dihapus. |
google.cloud.firestore.document.v1.written |
Dipicu saat dokumen dibuat, diperbarui, atau dihapus. |
Karakter pengganti ditulis dalam pemicu menggunakan tanda kurung kurawal, seperti berikut:
"projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}"
Menentukan jalur dokumen
Untuk memicu fungsi Anda, tentukan jalur dokumen yang akan diproses. Jalur dokumen harus berada dalam project Google Cloud yang sama dengan fungsinya.
Berikut adalah beberapa contoh jalur dokumen yang valid:
users/marie
: pemicu valid. Memantau satu dokumen,/users/marie
.users/{username}
: pemicu valid. Memantau semua dokumen pengguna. Karakter pengganti digunakan untuk memantau semua dokumen dalam koleksi.users/{username}/addresses
: pemicu tidak valid. Mengacu pada subkoleksiaddresses
, bukan dokumen.users/{username}/addresses/home
: pemicu valid. Memantau dokumen alamat rumah untuk semua pengguna.users/{username}/addresses/{addressId}
: pemicu valid. Memantau semua dokumen alamat.users/{user=**}
: pemicu valid. Memantau semua dokumen pengguna dan setiap dokumen dalam subkoleksi pada setiap dokumen pengguna seperti/users/userID/address/home
atau/users/userID/phone/work
.
Karakter pengganti dan parameter
Jika tidak mengetahui secara spesifik dokumen yang ingin dipantau, gunakan {wildcard}
, bukan ID dokumen:
users/{username}
akan memproses perubahan pada semua dokumen pengguna.
Dalam contoh ini, saat kolom dalam dokumen pada users
diubah, maka akan dicocokkan dengan karakter pengganti yang disebut {username}
.
Jika dokumen dalam users
memiliki
subkoleksi, dan kolom di salah satu dokumen subkoleksi tersebut diubah, karakter pengganti {username}
tidak akan terpicu. Jika sasaran Anda adalah juga merespons peristiwa di subkoleksi, gunakan karakter pengganti multi-segmen {username=**}
.
Kecocokan karakter pengganti diekstrak dari jalur dokumen. Anda dapat menentukan karakter pengganti sebanyak yang Anda inginkan untuk mengganti koleksi eksplisit atau ID dokumen. Anda dapat menggunakan maksimal satu karakter pengganti multi-segmen seperti {username=**}
.
Struktur peristiwa
Pemicu ini memanggil fungsi Anda dengan peristiwa yang mirip dengan ini:
{ "oldValue": { // Update and Delete operations only A Document object containing a pre-operation document snapshot }, "updateMask": { // Update operations only A DocumentMask object that lists changed fields. }, "value": { // A Document object containing a post-operation document snapshot } }
Setiap objek Document
berisi satu atau beberapa objek Value
. Lihat
dokumentasi Value
untuk referensi jenis. Hal ini sangat berguna jika Anda menggunakan bahasa yang diketik (seperti Go) untuk menulis fungsi.
Menyiapkan database Firestore
Anda memerlukan database Firestore untuk menguji sampel dalam dokumen ini. Atribut ini harus ada sebelum Anda men-deploy fungsi. Jika Anda belum memiliki database Firestore, buat dengan cara berikut:
Buka halaman Data Firestore.
Klik Pilih Mode Native .
Pilih region tempat database Anda berada. Pilihan ini bersifat permanen.
Klik Buat database.
Model data Firestore terdiri dari koleksi yang berisi dokumen. Setiap dokumen berisi kumpulan key-value pair.
Fungsi yang Anda buat dalam tutorial ini dipicu saat Anda membuat perubahan pada dokumen di dalam koleksi tertentu.
Contoh 1: Fungsi Hello Firestore
Contoh Cloud Function berikut mencetak kolom peristiwa Firestore yang memicu:
Node.js
Gunakan protobufjs untuk mendekode data peristiwa. Sertakan google.events.cloud.firestore.v1
data.proto
dalam sumber Anda.
Python
Go
Java
C#
Men-deploy fungsi Hello Firestore
Jika Anda belum melakukannya, siapkan database Firestore.
Untuk men-deploy fungsi Hello Firestore dengan pemicu Firestore, jalankan perintah berikut di direktori yang berisi kode contoh (atau untuk Java, file
pom.xml
):gcloud functions deploy FUNCTION_NAME \ --gen2 \ --runtime=RUNTIME \ --region=REGION \ --trigger-location=TRIGGER REGION \ --source=. \ --entry-point=ENTRY_POINT \ --trigger-event-filters=type=google.cloud.firestore.document.v1.written \ --trigger-event-filters=database='(default)' \ --trigger-event-filters-path-pattern=document='users/{username}'
Ganti kode berikut:
FUNCTION_NAME
: Nama untuk fungsi yang di-deploy.RUNTIME
: Runtime bahasa yang digunakan fungsi Anda.REGION
: Region tempat men-deploy fungsi Anda.TRIGGER_REGION
: Lokasi pemicu, yang harus sama dengan region database Firestore.ENTRY_POINT
: Titik entri ke fungsi Anda dalam kode sumber. Ini adalah kode yang dijalankan saat fungsi Anda berjalan.
Gunakan kolom lainnya sebagaimana adanya:
--trigger-event-filters=type=google.cloud.firestore.document.v1.written
menentukan bahwa fungsi dipicu saat dokumen dibuat, diupdate, atau dihapus, sesuai dengan jenis peristiwagoogle.cloud.firestore.document.v1.written
.--trigger-event-filters=database='(default)'
menentukan database Firebase. Untuk nama database default, gunakan(default)
.--trigger-event-filters-path-pattern=document='users/{username}'
memberikan pola jalur dokumen yang harus dipantau untuk melihat perubahan yang relevan. Pola jalur ini menyatakan bahwa semua dokumen dalam koleksiusers
harus dipantau. Untuk mengetahui informasi selengkapnya, lihat Memahami pola jalur.
Menguji fungsi Hello Firestore
Untuk menguji fungsi Hello Firestore, siapkan koleksi bernama users
di database Firestore Anda:
Di halaman data Firestore, klik Mulai koleksi baru.
Tentukan
users
sebagai ID koleksi.Untuk mulai menambahkan dokumen pertama koleksi, di bagian Tambahkan dokumen pertamanya, terima ID Dokumen yang dihasilkan secara otomatis.
Tambahkan setidaknya satu kolom untuk dokumen, dengan menentukan nama dan nilai. Dalam contoh ini, namanya adalah "username" dan nilainya adalah "rowan:"
Bila telah selesai, klik Simpan.
Tindakan ini akan membuat dokumen baru, sehingga memicu fungsi Anda.
Untuk mengonfirmasi bahwa fungsi Anda dipicu, klik nama fungsi tertaut di halaman Ringkasan Cloud Functions di Google Cloud Console untuk membuka Detail Functions.
Buka tab Log, lalu cari string ini:
Function triggered by change to: //firestore.googleapis.com/projects/your-project-id/databases/(default)'
Contoh 2: Fungsi Mengonversi ke Huruf Besar
Contoh ini mengambil nilai yang ditambahkan oleh pengguna, mengubah string di lokasi tersebut menjadi huruf besar, dan mengganti nilai dengan string huruf besar:
Node.js
Gunakan protobufjs untuk mendekode data peristiwa. Sertakan google.events.cloud.firestore.v1
data.proto
dalam sumber Anda.
Python
Go
Java
C#
Men-deploy fungsi Mengonversi ke Huruf Besar
Jika Anda belum melakukannya, siapkan database Firestore.
Gunakan perintah berikut untuk men-deploy fungsi yang dipicu oleh peristiwa tulis pada
companies/{CompanyId}
dokumen:gcloud functions deploy FUNCTION_NAME \ --gen2 \ --runtime=RUNTIME \ --trigger-location=TRIGGER REGION \ --region=REGION \ --source=. \ --entry-point=ENTRY_POINT \ --trigger-event-filters=type=google.cloud.firestore.document.v1.written \ --trigger-event-filters=database='(default)' \ --trigger-event-filters-path-pattern=document='messages/{pushId}'
Ganti kode berikut:
FUNCTION_NAME
: Nama untuk fungsi yang di-deploy.RUNTIME
: Runtime bahasa yang digunakan fungsi Anda.REGION
: Region tempat men-deploy fungsi Anda.TRIGGER_REGION
: Lokasi pemicu, yang harus sama dengan region database Firestore.ENTRY_POINT
: Titik entri ke fungsi Anda dalam kode sumber. Ini adalah kode yang dijalankan saat fungsi Anda berjalan.
Gunakan kolom lainnya sebagaimana adanya:
--trigger-event-filters=type=google.cloud.firestore.document.v1.written
menentukan bahwa fungsi dipicu saat dokumen dibuat, diupdate, atau dihapus, sesuai dengan jenis peristiwagoogle.cloud.firestore.document.v1.written
.--trigger-event-filters=database='(default)'
menentukan database Firestore. Untuk nama database default, gunakan(default)
.--trigger-event-filters-path-pattern=document='messages/{pushId}'
memberikan pola jalur dokumen yang harus dipantau untuk melihat perubahan yang relevan. Pola jalur ini menyatakan bahwa semua dokumen dalam koleksimessages
harus dipantau. Untuk mengetahui informasi selengkapnya, lihat Memahami pola jalur.
Menguji fungsi Mengonversi ke Huruf Besar
Untuk menguji fungsi Mengonversi ke Huruf Besar yang baru saja Anda deploy, siapkan koleksi bernama messages
di database Firestore Anda:
Buka halaman data Firestore.
Klik Mulai koleksi.
Tentukan
messages
sebagai ID koleksi.Untuk mulai menambahkan dokumen pertama koleksi, di bagian Tambahkan dokumen pertamanya, terima ID Dokumen yang dihasilkan secara otomatis.
Untuk memicu fungsi yang di-deploy, tambahkan dokumen dengan nama kolom yang "asli" dan nilai kolomnya adalah kata huruf kecil, misalnya:
Saat menyimpan dokumen, Anda dapat melihat kata dalam huruf kecil di kolom nilai yang dikonversi menjadi huruf besar.
Jika kemudian Anda mengedit nilai kolom agar berisi huruf kecil, hal tersebut akan memicu fungsi lagi, dan mengonversi semua huruf kecil menjadi huruf besar.
Batasan
Perhatikan batasan berikut untuk pemicu Firestore untuk Cloud Functions:
- Pengurutan tidak dijamin. Perubahan cepat dapat memicu pemanggilan fungsi dalam urutan yang tidak terduga.
- Peristiwa dikirim setidaknya satu kali, tetapi satu peristiwa dapat menghasilkan beberapa pemanggilan fungsi. Hindari mengandalkan mekanisme tepat satu kali, dan tulis fungsi idempoten.
- Firestore dalam mode Datastore memerlukan Cloud Functions (generasi ke-2). Cloud Functions (generasi ke-1) tidak mendukung mode Datastore.
- Cloud Functions (generasi ke-1) hanya berfungsi dengan database "(default)" dan tidak mendukung database bernama Firestore. Gunakan Cloud Functions (generasi ke-2) untuk mengonfigurasi peristiwa untuk database bernama.
- Pemicu dikaitkan dengan satu database. Anda tidak dapat membuat pemicu yang cocok dengan beberapa database.
- Menghapus database tidak secara otomatis menghapus pemicu untuk database tersebut. Pemicu berhenti mengirim peristiwa, tetapi akan tetap ada sampai Anda menghapus pemicu.
- Jika peristiwa yang cocok melebihi ukuran permintaan maksimum, peristiwa tersebut mungkin tidak akan dikirim ke Cloud Functions (generasi ke-1).
- Peristiwa yang tidak terkirim karena ukuran permintaan akan dicatat ke dalam log dalam log platform dan akan diperhitungkan dalam penggunaan log untuk project.
- Anda dapat menemukan log ini di Logs Explorer dengan pesan "Event dapat mengirim ke
Cloud function karena ukuran melebihi batas untuk generasi ke-1..." dengan tingkat keparahan
error
. Anda dapat menemukan nama fungsi di bawah kolomfunctionName
. Jika kolomreceiveTimestamp
masih berada dalam waktu satu jam dari sekarang, Anda dapat menyimpulkan konten peristiwa yang sebenarnya dengan membaca dokumen yang dimaksud menggunakan snapshot sebelum dan setelah stempel waktu. - Untuk menghindari peristiwa seperti ini, Anda dapat:
- Melakukan migrasi dan upgrade ke Cloud Functions (generasi ke-2)
- Memperkecil dokumen
- Menghapus Cloud Functions yang dimaksud
- Anda dapat menonaktifkan logging itu sendiri menggunakan pengecualian, tetapi perhatikan bahwa peristiwa yang melanggar tetap tidak akan dikirim.