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. Sebaiknya Anda menggunakan emulator hanya untuk pengujian lokal.

Jangan gunakan emulator untuk deployment produksi. Karena emulator menyimpan data hanya di memori, dan tidak akan mempertahankan data ketika dijalankan.

Menginstal emulator

Untuk menginstal emulator Firestore, instal dan update gcloud CLI:

  1. Instal gcloud CLI.

  2. Mengupdate penginstalan gcloud CLI Anda untuk mendapatkan info terbaru fitur:

    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 akan mencoba menggunakan 127.0.0.1:8080. Untuk mengikat emulator ke host dan port tertentu, gunakan flag --host-port opsional, 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, server library klien, library klien, atau SDK seluler/web.

Library klien server

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

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android, platform Apple, dan Web SDK

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

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 akan menghapus konten database saat dinonaktifkan. Sejak cache offline Firestore SDK tidak otomatis dihapus, Anda mungkin Anda ingin menonaktifkan persistensi lokal dalam konfigurasi emulator untuk menghindari perbedaan antara database yang diemulasikan 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 berada di emulator. Anda dapat menggunakan endpoint ini untuk menghapus data antarpengujian tanpa menonaktifkan emulator.

Untuk menghapus semua data di emulator, lakukan operasi DELETE HTTP terhadap endpoint berikut, menggantikan HOST dan PORT dengan host dan porta yang Anda pilih dan mengganti PROJECT_ID dengan ID project 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 menjalankan 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 layanan production

Emulator Firestore berupaya untuk mereplikasi atribut layanan produksi dengan beberapa batasan penting.

Transaksi

Emulator tidak mengimplementasikan semua perilaku transaksi dalam produksi. Saat Anda menguji fitur yang melibatkan beberapa penulisan serentak ke satu dokumen, emulator mungkin lambat untuk menyelesaikan permintaan tulis. Pada beberapa kasus, mungkin diperlukan hingga 30 detik hingga kunci dapat dilepas. Jika perlu, sesuaikan waktu tunggu pengujian.

Indeks

Emulator tidak melacak indeks gabungan dan akan mengeksekusi setiap indeks kueri yang valid. Pastikan untuk menguji aplikasi Anda di Firestore sungguhan instance 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.