Usa l'emulatore Firestore in locale

Google Cloud CLI fornisce un emulatore in memoria locale per Firestore che puoi utilizzare per testare la tua applicazione. Puoi utilizzare lo con tutte le librerie client di Firestore. Dovresti usare solo per i test locali.

Non utilizzare l'emulatore per i deployment in produzione. Poiché l'emulatore archivia solo in memoria, i dati non saranno conservati tra le esecuzioni.

Installa l'emulatore

Per installare l'emulatore Firestore, installa e aggiorna gcloud CLI:

  1. Installa gcloud CLI.

  2. Aggiorna l'installazione di gcloud CLI per ottenere le funzionalità più recenti:

    gcloud components update
    

Esegui l'emulatore

  1. Esegui il seguente comando per avviare l'emulatore:

    gcloud emulators firestore start
    

    L'emulatore stampa l'host e il numero di porta su cui è in esecuzione.

    Per impostazione predefinita, l'emulatore tenta di utilizzare 127.0.0.1:8080. Per associare l'emulatore a un host e una porta specifici, utilizza il flag facoltativo --host-port, sostituendo HOST e PORT:

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Digita Control + C per interrompere l'emulatore. L'emulatore può essere interrotto anche con un messaggio POST a /shutdown. Ad esempio:

    curl -d '' HOST:PORT/shutdown
    

Connettiti all'emulatore

La modalità di connessione all'emulatore dipende dal tipo di libreria client, server libreria client o SDK web/per dispositivi mobili.

Librerie client server

Per connettere un client server Firestore (C#, Go, Java, Node.js, PHP, Python e Ruby), imposta la variabile di ambiente FIRESTORE_EMULATOR_HOST. Quando questa variabile di ambiente è impostata, le librerie client del server si connettono automaticamente all'emulatore.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android, piattaforme Apple e SDK web

I seguenti esempi mostrano come collegare Android, piattaforme Apple e web SDK a 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

Versione web 9

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

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

Versione web 8

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

L'emulatore Firestore cancella i contenuti del database quando viene arrestato. Dal giorno la cache offline dell'SDK Firestore non viene cancellata automaticamente, puoi disattivare la persistenza locale nella configurazione dell'emulatore per evitare le discrepanze tra il database emulato e le cache locali; nell'SDK web, la persistenza è disabilitata per impostazione predefinita.

Cancellare i dati dell'emulatore

L'emulatore Firestore include un endpoint REST per l'eliminazione di tutte i dati attualmente presenti nell'emulatore. Puoi utilizzare questo endpoint per cancellare i dati tra un test e l'altro senza arrestare l'emulatore.

Per eliminare tutti i dati nell'emulatore, esegui un'operazione HTTP DELETE sul seguente endpoint, sostituendo HOST e PORT con l'host e la porta selezionati e PROJECT_ID con il tuo ID progetto:

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

Modifica l'host e la porta se l'emulatore non utilizza 127.0.0.1:8080. Il codice dovrebbe attendere la conferma REST che l'eliminazione sia terminata o non riuscita.

Puoi eseguire questa operazione dalla shell utilizzando curl:

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

Differenze tra l'emulatore Firestore e la produzione

L'emulatore Firestore tenta di replicare fedelmente il comportamento del servizio di produzione con alcune limitazioni degne di nota.

Transazioni

L'emulatore non implementa tutti i comportamenti di transazione osservati in produzione. Quando testi funzionalità che prevedono più scritture simultanee su un documento, l'emulatore potrebbe essere lento a completare la scrittura richieste. In alcuni casi, il rilascio dei blocchi può richiedere fino a 30 secondi. Se necessario, valuta la possibilità di modificare di conseguenza i timeout dei test.

Indici

L'emulatore non monitora gli indici composti ed eseguirà invece qualsiasi query valida. Assicurati di testare l'app su un'istanza Firestore reale per determinare gli indici di cui hai bisogno.

Limiti

L'emulatore non applica tutti i limiti applicati in produzione. Ad esempio: l'emulatore potrebbe consentire transazioni che verrebbero rifiutate in quanto troppo grandi dall' un servizio di produzione. Assicurati di conoscere i limiti documentati e di progettare la tua app in modo da evitarli in modo proattivo.