Pemicu Google Cloud Firestore (generasi ke-1)
Fungsi Cloud Run dapat menangani peristiwa di Firestore dalam project Google Cloud yang sama dengan fungsinya. Anda dapat membaca atau mengupdate Firestore sebagai respons terhadap peristiwa tersebut menggunakan Firestore API 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 |
---|---|
providers/cloud.firestore/eventTypes/document.create (default) |
Dipicu saat dokumen ditulisi untuk pertama kalinya. |
providers/cloud.firestore/eventTypes/document.update |
Dipicu saat dokumen sudah ada dan nilainya berubah. |
providers/cloud.firestore/eventTypes/document.delete |
Dipicu saat dokumen yang memuat data dihapus. |
providers/cloud.firestore/eventTypes/document.write |
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. Fungsi hanya merespons perubahan dokumen, dan tidak dapat memantau kolom atau koleksi tertentu. 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.
Menggunakan karakter pengganti dan parameter
Jika tidak mengetahui dokumen spesifik 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.
Kecocokan karakter pengganti diekstrak dari jalur dokumen. Anda dapat menentukan karakter pengganti sebanyak yang Anda inginkan untuk mengganti koleksi eksplisit atau ID dokumen.
Struktur peristiwa
Pemicu ini memanggil fungsi Anda dengan peristiwa yang mirip dengan yang ditampilkan di bawah 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.
Contoh kode
Contoh Cloud Function di bawah ini mencetak kolom peristiwa Cloud Firestore yang memicu:
Node.js
Python
Go
Java
C#
Ruby
PHP
Contoh di bawha ini mengambil nilai yang ditambahkan oleh pengguna, mengubah string di lokasi tersebut menjadi huruf besar, dan mengganti nilai dengan string huruf besar:
Node.js
Python
Go
Java
C#
Ruby
PHP
Men-deploy fungsi Anda
Perintah gcloud
berikut men-deploy fungsi yang dipicu oleh peristiwa penulisan pada /messages/{pushId}
dokumen:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --entry-point ENTRY_POINT \ --runtime RUNTIME \ --set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID \ --trigger-event "providers/cloud.firestore/eventTypes/document.write" \ --trigger-resource "projects/YOUR_PROJECT_ID/databases/(default)/documents/messages/{pushId}"
Argumen | Deskripsi |
---|---|
FUNCTION_NAME |
Nama Cloud Function yang terdaftar yang sedang Anda deploy.
Ini dapat berupa nama fungsi dalam kode sumber Anda, atau string arbitrer. Jika FUNCTION_NAME adalah string arbitrer, Anda harus menyertakan flag --entry-point .
|
--entry-point ENTRY_POINT |
Nama fungsi atau class dalam kode sumber Anda. Opsional, kecuali jika Anda tidak menggunakan FUNCTION_NAME untuk menentukan fungsi dalam kode sumber yang akan dijalankan selama deployment. Dalam hal ini, Anda harus menggunakan --entry-point untuk memberikan nama fungsi yang dapat dieksekusi.
|
--runtime RUNTIME |
Nama runtime yang Anda gunakan. Untuk daftar lengkapnya, lihat referensi gcloud .
|
--set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID |
ID unik project sebagai variabel lingkungan runtime. |
--trigger-event NAME |
Jenis peristiwa yang akan dipantau oleh fungsi (salah satu dari write , create , update , atau delete ).
|
--trigger-resource NAME |
Lokasi database yang sepenuhnya memenuhi syarat yang akan dipantau oleh fungsi.
Ini harus sesuai dengan format berikut:
"projects/YOUR_PROJECT_ID/databases/(default)/documents/PATH"
Teks {pushId} adalah parameter karakter pengganti yang dijelaskan di atas
dalam Menentukan jalur dokumen.
|
Batasan
Perhatikan batasan berikut untuk pemicu Firestore untuk fungsi Cloud Run:
- Fungsi Cloud Run (generasi ke-1) menjadi prasyarat database "(default)" yang ada dalam mode native Firestore. Lingkungan ini tidak mendukung mode Datastore atau database bernama Firestore. Gunakan fungsi Cloud Run (generasi ke-2) untuk mengonfigurasi peristiwa dalam kasus tersebut.
- 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 fungsi Cloud Run (generasi ke-2). Fungsi Cloud Run (generasi ke-1) tidak mendukung mode Datastore.
- 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 fungsi Cloud Run (generasi ke-1).
- Peristiwa yang tidak terkirim karena ukuran permintaan akan dicatat dalam log platform dan diperhitungkan terhadap 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 fungsi Cloud Run (generasi ke-2)
- Memperkecil dokumen
- Menghapus fungsi Cloud Run yang dimaksud
- Anda dapat menonaktifkan logging itu sendiri menggunakan pengecualian, tetapi perhatikan bahwa peristiwa yang melanggar tidak akan dikirim.