Connetti la tua app all'emulatore di Cloud Firestore

Prima di connettere l'app all'emulatore Cloud Firestore, assicurati che tu comprenda il flusso di lavoro generale Firebase Local Emulator Suite, e che tu installi e configuri il Local Emulator Suite e riveda i relativi comandi CLI.

Scegliere un progetto Firebase

Il Firebase Local Emulator Suite emula i prodotti per un singolo progetto Firebase.

Per selezionare il progetto da utilizzare, prima di avviare gli emulatori, esegui firebase use nella CLI nella directory di lavoro. In alternativa, puoi passare il --project flag a ogni comando dell'emulatore.

Local Emulator Suite supporta l'emulazione di progetti Firebase reali e progetti demo.

Tipo di progetto Funzionalità Utilizzo con gli emulatori
Reale

Un progetto Firebase reale è un progetto che hai creato e configurato (molto probabilmente tramite la Firebase console).

I progetti reali hanno risorse live, come istanze di database, bucket di archiviazione, funzioni o qualsiasi altra risorsa configurata per quel progetto Firebase.

Quando lavori con progetti Firebase reali, puoi eseguire emulatori per tutti o alcuni dei prodotti supportati.

Per i prodotti che non stai emulando, le tue app e il tuo codice interagiranno con la risorsa live (istanza di database, bucket di archiviazione, funzione e così via).

Demo

Un progetto Firebase demo non ha una configurazione Firebase reale e non ha risorse live. In genere, si accede a questi progetti tramite codelab o altri tutorial.

Gli ID progetto per i progetti demo hanno il demo- prefisso.

Quando lavori con progetti Firebase demo, le tue app e il tuo codice interagiscono con gli emulatori solo. Se la tua app tenta di interagire con una risorsa per cui non è in esecuzione un emulatore, il codice non verrà eseguito.

Ti consigliamo di utilizzare i progetti demo, se possibile. I vantaggi includono:

  • Configurazione più semplice, poiché puoi eseguire gli emulatori senza dover creare un progetto Firebase
  • Maggiore sicurezza, poiché se il codice richiama accidentalmente risorse non emulate (di produzione), non c'è alcuna possibilità di modifica dei dati, utilizzo e fatturazione
  • Migliore supporto offline, poiché non è necessario accedere a internet per scaricare la configurazione dell'SDK.

Strumentare l'app per comunicare con gli emulatori

All'avvio, l'emulatore Cloud Firestore crea un database predefinito e un database denominato per ogni configurazione firestore nel file firebase.json.

I database denominati vengono creati anche implicitamente in risposta a qualsiasi chiamata SDK o API REST all'emulatore che fa riferimento a un database specifico. Questi database creati implicitamente operano con regole aperte.

Per lavorare in modo interattivo con i database predefiniti e denominati nell' Emulator Suite UI, aggiorna l'URL nella barra degli indirizzi del browser per selezionare il database predefinito o un database denominato.

  • Ad esempio, per sfogliare i dati nell'istanza predefinita, aggiorna l'URL a localhost:4000/firestore/default/data
  • Per sfogliare un'istanza denominata ecommerce, aggiorna a localhost:4000/firestore/ecommerce/data.

SDK per Android, piattaforme Apple e web

Configura le classi di test o la configurazione in-app per interagire con Cloud Firestore nel seguente modo. Tieni presente che negli esempi seguenti il codice dell'app si connette al database del progetto predefinito. Per esempi che coinvolgono database Cloud Firestore aggiuntivi oltre al database predefinito, consulta la guida per più database.

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

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 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

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

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

Web

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

Non è necessaria alcuna configurazione aggiuntiva per testare Cloud Functions attivate dagli eventi di Firestore utilizzando l'emulatore. Quando gli emulatori di Firestore e Cloud Functions sono entrambi in esecuzione, funzionano automaticamente insieme.

Admin SDKs

Gli Firebase Admin SDK si connettono automaticamente all'Cloud Firestore emulatore quando è impostata la variabile di ambiente FIRESTORE_EMULATOR_HOST:

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

Se il codice è in esecuzione all'interno dell'Cloud Functions emulatore, l'ID progetto e altre configurazioni vengono impostati automaticamente quando chiami initializeApp.

Se vuoi che il codice Admin SDK si connetta a un emulatore condiviso in esecuzione in un altro ambiente, devi specificare lo stesso ID progetto che hai impostato utilizzando la CLI Firebase. Puoi passare un ID progetto direttamente a initializeApp o impostare la GCLOUD_PROJECT variabile di ambiente.

SDK Admin Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variabile di ambiente
export GCLOUD_PROJECT="your-project-id"

API REST di Cloud Firestore

L'emulatore di Cloud Firestore fornisce un endpoint REST per interagire con il tuo database. Tutte le chiamate API REST devono essere effettuate all'http://localhost:8080/v1 endpoint.

Il percorso completo per una chiamata REST segue il pattern:

http://localhost:8080/v1/projects/{project_id}/databases/{database_id}/documents/{document_path}

Ad esempio, per elencare tutti i documenti nella raccolta users per il progetto my-project-id, puoi utilizzare curl:

curl -X GET "http://localhost:8080/v1/projects/my-project-id/databases/(default)/documents/users"

Cancellare il database tra i test

Firestore di produzione non fornisce un metodo SDK della piattaforma per svuotare il database, ma l'emulatore di Firestore fornisce un endpoint REST appositamente per questo scopo, che può essere chiamato da un passaggio di configurazione/rimozione del framework di test, da una classe di test o dalla shell (ad es. con curl) prima dell'avvio di un test. Puoi utilizzare questo approccio in alternativa alla semplice chiusura del processo dell'emulatore.

In un metodo appropriato, esegui un'operazione HTTP DELETE, fornendo l'ID progetto Firebase, ad esempio firestore-emulator-example, al seguente endpoint:

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

Naturalmente, il codice deve attendere la conferma REST che lo svuotamento è stato completato o non è riuscito.

Puoi eseguire questa operazione dalla shell:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

Dopo aver implementato un passaggio di questo tipo, puoi sequenziare i test e attivare le funzioni con la certezza che i dati precedenti verranno eliminati tra le esecuzioni e che stai utilizzando una configurazione di test di base nuova.

Importare ed esportare dati

Gli emulatori di database e Cloud Storage for Firebase ti consentono di esportare i dati da un'istanza dell'emulatore in esecuzione. Definisci un insieme di dati di base da utilizzare nei tuoi test unità o workflow di integrazione continua, quindi esportalo per condividerlo con il team.

firebase emulators:export ./dir

Nei test, all'avvio dell'emulatore, importa i dati di base.

firebase emulators:start --import=./dir

Puoi indicare all'emulatore di esportare i dati alla chiusura, specificando un percorso di esportazione o semplicemente utilizzando il percorso passato al --import flag.

firebase emulators:start --import=./dir --export-on-exit

Queste opzioni di importazione ed esportazione dei dati funzionano anche con il firebase emulators:exec comando. Per saperne di più, consulta il riferimento ai comandi dell'emulatore.

Visualizzare l'attività delle regole di sicurezza

Durante i cicli di prototipazione e test, puoi utilizzare gli strumenti di visualizzazione e i report forniti da Local Emulator Suite.

Utilizzare il monitoraggio delle richieste

L'Cloud Firestore emulator ti consente di visualizzare le richieste dei client in l'Emulator Suite UI, inclusa la traccia della valutazione per Firebase Security Rules.

Apri la scheda Firestore > Richieste per visualizzare la sequenza di valutazione dettagliata per ogni richiesta.

Monitoraggio delle richieste dell'emulatore Firestore che mostra le valutazioni delle regole di sicurezza

Visualizzare i report sulle valutazioni delle regole

Quando aggiungi regole di sicurezza al prototipo, puoi eseguirne il debug con Local Emulator Suite strumenti di debug.

Dopo aver eseguito una serie di test, puoi accedere ai report sulla copertura dei test che mostrano come è stata valutata ogni regola di sicurezza.

Per ottenere i report, esegui una query su un endpoint esposto nell'emulatore mentre è in esecuzione. Per una versione compatibile con il browser, utilizza il seguente URL:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

Le regole vengono suddivise in espressioni e sottoespressioni su cui puoi passare il mouse per visualizzare ulteriori informazioni, tra cui il numero di valutazioni e i valori restituiti. Per la versione JSON non elaborata di questi dati, includi il seguente URL nella query:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

Qui, la versione HTML del report evidenzia le valutazioni che generano errori di valori non definiti e nulli:

Differenze tra l'emulatore Cloud Firestore e la produzione

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

Supporto di più database per Cloud Firestore

Al momento, il Emulator Suite UI supporta la creazione, la modifica, l'eliminazione, il monitoraggio delle richieste e la visualizzazione della sicurezza interattivi per un database predefinito, ma non per database denominati aggiuntivi.

Tuttavia, l'emulatore stesso crea un database denominato in base alla configurazione nel file firebase.json e implicitamente in risposta alle chiamate SDK o API REST.

Transazioni

Al momento, l'emulatore non implementa tutto il comportamento delle transazioni osservato in produzione. Quando testi funzionalità che prevedono più scritture simultanee in un documento, l'emulatore potrebbe impiegare più tempo per completare le richieste di scrittura. In alcuni casi, il rilascio dei blocchi potrebbe richiedere fino a 30 secondi. Se necessario, valuta la possibilità di modificare i timeout dei test di conseguenza.

Indici

L'emulatore non tiene traccia degli indici composti ed esegue invece qualsiasi query valida. Assicurati di testare l'app su un'istanza Cloud Firestore reale per determinare gli indici di cui avrai bisogno.

Limiti

L'emulatore non applica tutti i limiti applicati in produzione. Ad esempio, l'emulatore potrebbe consentire transazioni che verrebbero rifiutate come troppo grandi dal servizio di produzione. Assicurati di conoscere i limiti documentati e di progettare l'app in modo da evitarli in modo proattivo.

Che cosa succede ora?