Menggunakan emulator Firestore secara lokal

Google Cloud CLI menyediakan emulator dalam memori lokal untuk Firestore yang dapat Anda gunakan untuk menguji aplikasi. Anda dapat menggunakan emulator dengan semua library klien Firestore. Anda hanya boleh menggunakan emulator untuk pengujian lokal.

Jangan gunakan emulator untuk deployment produksi. Karena emulator hanya menyimpan data dalam memori, emulator tidak akan mempertahankan data di seluruh proses.

Menginstal emulator

Untuk menginstal emulator Firestore, instal dan update gcloud CLI:

  1. Instal gcloud CLI.

  2. Update penginstalan gcloud CLI Anda untuk mendapatkan fitur terbaru:

    gcloud components update
    

Menjalankan emulator

  1. Jalankan perintah berikut untuk memulai emulator:

    gcloud emulators firestore start
    

    Emulator mencetak host dan nomor port tempat emulator berjalan.

    Secara default, emulator mencoba menggunakan 127.0.0.1:8080. Untuk mengikat emulator ke host dan port tertentu, gunakan flag --host-port opsional, dengan mengganti HOST dan PORT:

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Ketik Control + C untuk menghentikan emulator. Emulator juga dapat dihentikan dengan POST ke /shutdown. Contoh:

    curl -d '' HOST:PORT/shutdown
    

Menghubungkan ke emulator

Cara Anda terhubung ke emulator bergantung pada jenis library klien, library klien server, atau SDK seluler/web.

Library klien server

Untuk menghubungkan library klien server Firestore (C#, Go, Java, Node.js, PHP, Python, dan Ruby), tetapkan variabel lingkungan FIRESTORE_EMULATOR_HOST. Jika variabel lingkungan ini ditetapkan, library klien server akan otomatis terhubung ke emulator.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android, platform Apple, dan Web SDK

Contoh berikut menunjukkan cara menghubungkan Android, platform Apple, dan Web SDK ke emulator Firestore:

Android
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web versi 9

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web versi 8

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

Emulator Firestore dalam Mode Native akan menghapus isi database saat dinonaktifkan. Karena cache offline Firestore SDK tidak dihapus secara otomatis, sebaiknya nonaktifkan persistensi lokal dalam konfigurasi emulator Anda untuk menghindari perbedaan antara database yang diemulasi dan cache lokal. Di Web SDK, persistensi dinonaktifkan secara default.

Menghapus data emulator

Emulator Firestore menyertakan endpoint REST untuk menghapus semua data yang saat ini ada di emulator. Anda dapat menggunakan endpoint ini untuk menghapus data di antara pengujian tanpa menonaktifkan emulator.

Untuk menghapus semua data di emulator, lakukan operasi HTTP DELETE terhadap endpoint berikut, ganti HOST dan PORT dengan host dan port yang Anda pilih, lalu ganti PROJECT_ID dengan project ID Anda sendiri:

http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents

Sesuaikan host dan port jika emulator tidak menggunakan 127.0.0.1:8080. Kode Anda harus menunggu konfirmasi REST bahwa penghapusan selesai atau gagal.

Anda dapat melakukan operasi ini dari shell menggunakan curl:

$ curl -v -X DELETE "http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents"

Perbedaan emulator Firestore dengan produksi

Emulator Firestore berupaya mereplikasi perilaku layanan produksi secara akurat, tetapi ada beberapa batasan yang perlu diketahui.

Transaksi

Emulator tidak berupaya meniru perilaku transaksi yang terlihat dalam layanan produksi. Contoh ini menggunakan pendekatan penguncian sederhana dan tidak mencoba mencerminkan berbagai mode serentak yang ditawarkan di lingkungan produksi.

Saat Anda menguji fitur yang melibatkan beberapa penulisan serentak ke satu dokumen, emulator mungkin lambat untuk menyelesaikan permintaan tulis. Mungkin diperlukan waktu hingga 30 detik agar emulator melepaskan kunci. Jika Anda perlu menyesuaikan interval waktu tunggu pengujian, lakukan penyesuaian tersebut.

Emulator juga tidak berupaya meniru semua batas produksi, seperti batas waktu & batas ukuran, yang melibatkan transaksi. Jika Anda menguji fitur yang bergantung pada batas produksi ini, sebaiknya gunakan lingkungan produksi, bukan emulator.

Indeks

Emulator tidak melacak indeks gabungan, melainkan akan mengeksekusi kueri apa pun yang valid. Pastikan untuk menguji aplikasi Anda terhadap instance Firestore sungguhan untuk menentukan indeks yang Anda perlukan.

Batas

Emulator tidak menerapkan semua batasan yang diterapkan dalam layanan produksi. Misalnya, emulator dapat mengizinkan transaksi yang akan ditolak oleh layanan produksi karena terlalu besar. Pastikan Anda memahami batasan yang didokumentasikan dan mendesain aplikasi untuk menghindarinya secara proaktif.