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 die Emulator mit allen Firestore-Clientbibliotheken. Sie sollten den Emulator nur für lokale Tests.

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

Installieren und aktualisieren Sie zum Installieren des Firestore-Emulators die gcloud CLI:

  1. Installieren Sie das gcloud-CLI.

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

    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. Um die zu einem bestimmten Host und Port hinzufügen, verwenden Sie das optionale Flag --host-port, HOST und PORT werden ersetzt:

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

    curl -d '' HOST:PORT/shutdown
    

Mit dem Emulator verbinden

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

Server-Clientbibliotheken

So verbinden Sie einen Firestore-Serverclient: Bibliothek (C#, Go, Java, Node.js, PHP, Python und Ruby), Legen Sie die Umgebungsvariable FIRESTORE_EMULATOR_HOST fest. Wenn diese Umgebung festgelegt ist, stellen die Server-Clientbibliotheken automatisch eine Verbindung zum Emulator her.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android-, Apple-Plattformen und Web-SDKs

Die folgenden Beispiele zeigen, wie Sie die Verbindung Android-, Apple-Plattformen und Web-SDKs in 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

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 löscht den Datenbankinhalt beim Herunterfahren. Da der Offlinecache des Firestore SDK nicht automatisch geleert wird, sollten Sie die lokale Persistenz in Ihrer Emulatorkonfiguration deaktivieren, um Abweichungen zwischen der emulierten Datenbank und den lokalen Caches zu vermeiden. Im Web SDK ist die Persistenz standardmäßig deaktiviert.

Emulatordaten löschen

Der Firestore-Emulator enthält einen REST-Endpunkt zum Löschen aller die sich aktuell im Emulator befinden. Mit diesem Endpunkt können Sie Daten 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 folgenden Endpunkt, wobei HOST und PORT durch den Host und Port, den Sie ausgewählt haben, und ersetzen Sie PROJECT_ID durch Ihren 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 127.0.0.1:8080 nicht verwendet. Ihr Code sollte auf die REST-Bestätigung warten, dass der Löschvorgang abgeschlossen wurde 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 des Produktionsdienstes mit einigen nennenswerten Einschränkungen.

Transaktionen

Der Emulator implementiert nicht das gesamte Transaktionsverhalten in der Produktion gesehen werden. Wenn Sie Funktionen testen, die mehrere gleichzeitig in ein Dokument schreiben, kann der Emulator den Schreibvorgang lange dauern. -Anfragen. In einigen Fällen kann es bis zu 30 Sekunden dauern, bis die Sperre aufgehoben wird. Passen Sie die Testzeitlimits bei Bedarf entsprechend an.

Indexe

Der Emulator verfolgt keine zusammengesetzten Indexe und führt stattdessen gültige Abfrage. Testen Sie Ihre Anwendung mit einem echten Firestore Instanz, um zu bestimmen, welche Indexe Sie benötigen.

Limits

Der Emulator erzwingt nicht alle in der Produktion erzwungenen Limits. Beispiel: kann der Emulator Transaktionen zulassen, die vom Produktionsdiensts. Machen Sie sich mit den dokumentierte Beschränkungen und die Entwicklung deiner App proaktiv vermeiden.