Firestore-Emulator lokal verwenden

Die Google Cloud CLI stellt einen lokalen Emulator im Speicher für Firestore zur Verfügung. Mit ihm können Sie Ihre Anwendung testen. Sie können den Emulator mit allen Firestore-Clientbibliotheken verwenden. Sie sollten den Emulator nur für lokale Tests verwenden.

Verwenden Sie den Emulator nicht für Produktionsbereitstellungen. Da der Emulator die Daten nur zwischenspeichert, behält er keine Daten über die verschiedenen Testläufe bei.

Emulator installieren

So installieren Sie den Firestore-Emulator: Installieren Sie die gcloud CLI und aktualisieren Sie sie:

  1. Installieren Sie das gcloud-CLI.

  2. Aktualisieren Sie die Installation der gcloud CLI, um die neuesten Funktionen zu erhalten:

    gcloud components update
    

Emulator starten

  1. Verwenden Sie den folgenden Befehl, um den Emulator zu starten:

    gcloud emulators firestore start
    

    Der Emulator gibt den Host und die Portnummer aus, wenn er ausgeführt wird.

    Standardmäßig versucht der Emulator, 127.0.0.1:8080 zu verwenden. Binden Sie den Emulator mit dem optionalen Flag --host-port an einen bestimmten Host und Port. Ersetzen Sie dabei HOST und PORT durch Ihre Werte:

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Geben Sie Control + C ein, um den Emulator zu beenden. Der Emulator kann auch mit einem POST an /shutdown beendet werden. Beispiel:

    curl -d '' HOST:PORT/shutdown
    

Verbindung zum Emulator herstellen

Wie Sie eine Verbindung zum Emulator herstellen, hängt vom Typ der Clientbibliothek, Server-Clientbibliothek oder des mobilen/Web-SDK ab.

Server-Clientbibliotheken

Wenn Sie eine Firestore-Server-Clientbibliothek (C#, Go, Java, Node.js, PHP, Python und Ruby) verbinden möchten, legen Sie die Umgebungsvariable FIRESTORE_EMULATOR_HOST fest. Wenn diese Umgebungsvariable festgelegt ist, stellen die Server-Clientbibliotheken automatisch eine Verbindung zum Emulator her.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android-, Apple-Plattform- und Web-SDKs

Die folgenden Beispiele zeigen, wie Sie die Android-, Apple-Plattformen und Web-SDKs mit dem Firestore-Emulator verbinden:

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

Webversion 9

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

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

Webversion 8

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

Der Firestore-Emulator im nativen Modus löscht den Datenbankinhalt beim Herunterfahren. Da der Offlinecache des Firestore SDK nicht automatisch gelöscht wird, sollten Sie die lokale Persistenz in Ihrer Emulatorkonfiguration deaktivieren, um Abweichungen zwischen der emulierten Datenbank und lokalen Caches zu vermeiden. Im Web SDK ist die Persistenz standardmäßig deaktiviert.

Emulator-Daten löschen

Der Firestore-Emulator enthält einen REST-Endpunkt zum Löschen aller Daten, die sich derzeit im Emulator befinden. Mit diesem Endpunkt können Sie Daten zwischen Tests löschen, ohne den Emulator herunterzufahren.

Wenn Sie alle Daten im Emulator löschen möchten, führen Sie einen HTTP-DELETE-Vorgang für den folgenden Endpunkt aus. Ersetzen Sie dabei HOST und PORT durch den von Ihnen ausgewählten Host und Port und PROJECT_ID durch Ihre eigene Projekt-ID:

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

Passen Sie den Host und den Port an, wenn der Emulator nicht 127.0.0.1:8080 verwendet. Ihr Code sollte auf die REST-Bestätigung warten, dass die Löschung abgeschlossen oder fehlgeschlagen ist.

Sie können diesen Vorgang über die Shell mit curl ausführen:

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

Unterschiede zwischen dem Firestore-Emulator und der Produktion

Der Firestore-Emulator versucht, das Verhalten des Produktionsdienstes möglichst genau nachzubilden, es gibt jedoch einige wichtige Einschränkungen.

Transaktionen

Der Emulator versucht nicht, das Transaktionsverhalten in der Produktion nachzubilden. Es wird ein einfacher Sperransatz verwendet und es wird nicht versucht, die verschiedenen Parallelitätsmodi in der Produktionsumgebung zu spiegeln.

Wenn Sie Funktionen testen, bei denen mehrere gleichzeitige Schreibvorgänge in ein Dokument erfolgen, kann es sein, dass der Emulator Schreibanfragen nur langsam ausführt. Es kann bis zu 30 Sekunden dauern, bis der Emulator die Sperren aufhebt. Passen Sie die Test-Timeout-Intervalle bei Bedarf an.

Der Emulator versucht auch nicht, alle Produktionslimits wie Zeitüberschreitungen und Größenbeschränkungen für Transaktionen zu imitieren. Wenn Sie Funktionen testen, die von diesen Produktionslimits abhängen, empfehlen wir, anstelle eines Emulators eine Produktionsumgebung zu verwenden.

Indexe

Der Emulator verfolgt keine zusammengesetzten Indexe, sondern führt stattdessen jede gültige Abfrage aus. Testen Sie Ihre App mit einer echten Firestore-Instanz, um zu ermitteln, welche Indexe Sie benötigen.

Limits

Im Emulator werden nicht alle in der Produktion geltenden Einschränkungen erzwungen. Beispiel: Der Emulator kann Transaktionen zulassen, die vom Produktionsdienst als zu groß abgelehnt würden. Machen Sie sich mit den dokumentierten Limits vertraut und entwickeln Sie Ihre App so, dass diese Limits nicht überschritten werden.