Pemicu Firebase Realtime Database
Dengan Cloud Run Functions, Anda dapat menangani peristiwa di Firebase Realtime Database dalam project Google Cloud yang sama dengan fungsi. Cloud Run Functions dapat Anda gunakan untuk menjalankan operasi database dengan hak istimewa administratif penuh, dan memastikan setiap perubahan di database diproses secara terpisah. Anda dapat membuat perubahan pada Firebase Realtime Database melalui Firebase Admin SDK.
Dalam siklus proses umum, fungsi Firebase Realtime Database melakukan hal-hal berikut:
Menunggu perubahan pada lokasi database tertentu.
Terpicu ketika suatu peristiwa terjadi dan menjalankan tugasnya.
Menerima objek data yang berisi snapshot data yang disimpan dalam dokumen yang ditentukan.
Jenis peristiwa
Dengan Functions, Anda dapat menangani peristiwa di dua tingkat kekhususan. Anda dapat hanya memproses peristiwa pembuatan, pembaruan, atau penghapusan secara khusus, atau Anda dapat memproses perubahan apa pun pada jalur. Cloud Run Functions mendukung jenis peristiwa berikut untuk Realtime Database:
| Jenis Peristiwa | Pemicu |
|---|---|
providers/google.firebase.database/eventTypes/ref.write |
Dipicu saat peristiwa mutasi: saat data dibuat, diperbarui, atau dihapus di Realtime Database. |
providers/google.firebase.database/eventTypes/ref.create (default) |
Dipicu saat data baru dibuat di Realtime Database. |
providers/google.firebase.database/eventTypes/ref.update |
Dipicu saat data diperbarui di Realtime Database. |
providers/google.firebase.database/eventTypes/ref.delete |
Dipicu saat data dihapus dari Realtime Database. |
Menentukan instance dan jalur database
Untuk mengontrol kapan dan di mana fungsi Anda terpicu, Anda perlu menentukan jalur, dan secara opsional menentukan instance database.
Jalur
Spesifikasi jalur cocok dengan semua penulisan yang menyentuh suatu jalur,
termasuk penulisan yang terjadi di bawahnya. Jika Anda menetapkan /foo/bar sebagai jalur fungsi,
jalur tersebut akan cocok dengan peristiwa di kedua lokasi ini:
/foo/bar
/foo/bar/baz/really/deep/path
Bagaimanapun juga, Firebase akan menafsirkan bahwa peristiwa terjadi di /foo/bar,
dan data peristiwa menyertakan data lama dan baru di /foo/bar. Jika data peristiwa kemungkinan berukuran besar,
sebaiknya gunakan beberapa fungsi di jalur yang lebih dalam, bukan fungsi tunggal
di dekat root database Anda. Untuk mendapatkan performa terbaik, hanya minta data di level sedalam mungkin.
Anda dapat menentukan komponen jalur sebagai karakter pengganti dengan mengapitnya
menggunakan tanda kurung kurawal; foo/{bar} cocok dengan turunan apa pun dari /foo. Nilai komponen jalur karakter pengganti ini
tersedia dalam objek event.params di fungsi Anda.
Dalam contoh ini, nilainya tersedia sebagai event.params.bar.
Jalur dengan karakter pengganti dapat cocok dengan beberapa peristiwa dari satu penulisan. Sisipan:
{
"foo": {
"hello": "world",
"firebase": "functions"
}
}
cocok dengan jalur /foo/{bar} dua kali: sekali dengan "hello": "world" dan sekali lagi dengan "firebase": "functions".
Instance
Saat menggunakan konsol Google Cloud , instance database harus ditentukan.
Saat menggunakan Google Cloud CLI, instance harus ditentukan sebagai
bagian dari string --trigger-resource.
Misalnya, string berikut akan menggunakan string berikut
dalam string --trigger-resource Anda:
--trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/PATH
Struktur peristiwa
Saat menangani peristiwa Realtime Database, objek data berisi dua properti
yang disediakan dalam format objek JSON:
data: snapshot data yang diambil sebelum peristiwa yang memicu fungsi.delta: snapshot data yang diambil setelah peristiwa yang memicu fungsi.
Contoh kode
Node.js
Python
Go
Java
C#
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Firebase.Database.V1; using Microsoft.Extensions.Logging; using System.Threading; using System.Threading.Tasks; namespace FirebaseRtdb; public class Function : ICloudEventFunction<ReferenceEventData> { private readonly ILogger _logger; public Function(ILogger<Function> logger) => _logger = logger; public Task HandleAsync(CloudEvent cloudEvent, ReferenceEventData data, CancellationToken cancellationToken) { _logger.LogInformation("Function triggered by change to {subject}", cloudEvent.Subject); _logger.LogInformation("Delta: {delta}", data.Delta); // In this example, we don't need to perform any asynchronous operations, so the // method doesn't need to be declared async. return Task.CompletedTask; } }
Ruby
PHP
use Google\CloudFunctions\CloudEvent; function firebaseRTDB(CloudEvent $cloudevent) { $log = fopen(getenv('LOGGER_OUTPUT') ?: 'php://stderr', 'wb'); fwrite($log, 'Event: ' . $cloudevent->getId() . PHP_EOL); $data = $cloudevent->getData(); $resource = $data['resource'] ?? '<null>'; fwrite($log, 'Function triggered by change to: ' . $resource . PHP_EOL); $isAdmin = isset($data['auth']['admin']) && $data['auth']['admin'] == true; fwrite($log, 'Admin?: ' . var_export($isAdmin, true) . PHP_EOL); fwrite($log, 'Delta: ' . json_encode($data['delta'] ?? '') . PHP_EOL); }
Men-deploy fungsi Anda
Perintah gcloud berikut men-deploy fungsi
yang akan dipicu oleh peristiwa create di jalur /messages/{pushId}/original:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --entry-point ENTRY_POINT \ --trigger-event providers/google.firebase.database/eventTypes/ref.create \ --trigger-resource projects/_/instances/DATABASE_INSTANCE/refs/messages/{pushId}/original \ --runtime RUNTIME
| Argumen | Deskripsi |
|---|---|
FUNCTION_NAME |
Nama fungsi Cloud Run yang terdaftar, yang sedang Anda deploy.
Nama 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.
|
--trigger-event NAME |
Nama jenis peristiwa yang ingin diterima fungsi. Dalam hal ini, nama jenis peristiwa tersebut adalah salah satu dari berikut ini: write, create, update, atau delete. |
--trigger-resource NAME |
Jalur database yang sepenuhnya memenuhi syarat yang akan diproses oleh fungsi.
Jalur ini harus sesuai dengan format berikut:
projects/_/instances/DATABASE_INSTANCE/refs/PATH.
|
--runtime RUNTIME |
Nama runtime yang Anda gunakan. Untuk mengetahui daftar lengkapnya,
lihat referensi gcloud.
|