Łączenie aplikacji z emulatorem Cloud Firestore

Zanim połączysz aplikację z emulatorem Cloud Firestore, poznaj ogólny przepływ pracy Firebase Local Emulator Suite oraz zainstaluj i skonfiguruj Local Emulator Suite oraz przejrzyj jego polecenia interfejsu wiersza poleceń.

Wybieranie projektu Firebase

Funkcja Firebase Local Emulator Suite emuluje produkty z jednego projektu Firebase.

Aby wybrać projekt, który ma być używany, przed uruchomieniem emulatorów uruchom w CLI polecenie firebase use w katalogu roboczym. Możesz też przekazać parametr --project do każdego polecenia emulatora.

Local Emulator Suite obsługuje emulację prawdziwych projektów Firebase oraz projektów demonstracyjnych.

Typ projektu Funkcje Używanie z emulatorami
Real

Prawdziwy projekt Firebase to projekt utworzony i skonfigurowany przez Ciebie (najprawdopodobniej za pomocą konsoli Firebase).

Rzeczywiste projekty mają aktywne zasoby, takie jak instancje bazy danych, zasobniki na dane, funkcje lub inne zasoby skonfigurowane dla danego projektu Firebase.

Podczas pracy z prawdziwymi projektami Firebase możesz uruchamiać emulatory dla wszystkich lub niektórych obsługiwanych usług.

W przypadku usług, których nie emulujesz, Twoje aplikacje i kod będą wchodzić w interakcję z aktywnymi zasobami (instancjami baz danych, zasobnikami, funkcjami itp.).

Wersja demonstracyjna

Demonstracyjny projekt Firebase nie ma rzeczywistej konfiguracji Firebase i żadnych zasobów w produkcji. Do tych projektów zwykle uzyskuje się dostęp za pomocą ćwiczeń z programowania lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

Podczas pracy z demonstracyjnymi projektami Firebase aplikacje i kod będą wchodzić w interakcje z emulatorami tylko. Jeśli aplikacja spróbuje wejść w interakcję z zasobem, dla którego emulator nie jest uruchomiony, ten kod zakończy się niepowodzeniem.

W miarę możliwości zalecamy korzystanie z projektów demonstracyjnych. W ten sposób możesz zapewnić im dostęp do tych korzyści:

  • Łatwiejsza konfiguracja, ponieważ możesz uruchamiać emulatory bez tworzenia projektu Firebase.
  • Silniejsze bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła zasoby nieemulowane (produkcyjne), nie ma szans na zmianę danych, ich wykorzystanie i płatności
  • lepszą obsługę offline, ponieważ do pobrania konfiguracji pakietu SDK nie jest potrzebny dostęp do internetu;

Dostosuj aplikację do emulatorów

Po uruchomieniu emulator Cloud Firestore tworzy domyślną bazę danych i nazwaną bazę danych dla każdej konfiguracji firestore w pliku firebase.json.

Nazwane bazy danych są też tworzone domyślnie w odpowiedzi na wszystkie wywołania pakietu SDK lub interfejsu API REST kierowane do emulatora, które odwołują się do konkretnej bazy danych. Takie bazy danych tworzone w sposób domyślny działają zgodnie z regułami otwartymi.

Aby w interaktywny sposób pracować z bazami danych domyślnymi i nazwistymi w programie Emulator Suite UI, na pasku adresu przeglądarki zaktualizuj adres URL, aby wybrać bazę domyślną lub nazwaną.

  • Aby na przykład przeglądać dane w domyślnej instancji, zaktualizuj adres URL do:localhost:4000/firestore/default/data
  • Aby przeglądać instancję o nazwie ecommerce, zaktualizuj ją do wersji localhost:4000/firestore/ecommerce/data.

Pakiety SDK na Androida i platformy Apple oraz pakiety SDK internetowe

Skonfiguruj konfigurację w aplikacji lub przetestuj klasy, aby sprawdzić, czy działają one prawidłowo z usługą Cloud Firestore: Pamiętaj, że w tych przykładach kod aplikacji łączy się z domyślną bazą danych projektu. Przykłady dotyczące dodatkowych baz danych Cloud Firestore oprócz domyślnej znajdziesz w przewodniku dotyczącym wielu baz danych.

Kotlin+KTX
// 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);
}

Aby przetestować funkcje Cloud Functions uruchamiane przez zdarzenia Firestore za pomocą emulatora, nie musisz nic konfigurować. Gdy emulatory Firestore i Cloud Functions są uruchomione, automatycznie współpracują ze sobą.

Admin SDK s

Gdy skonfigurowana jest zmienna środowiskowa FIRESTORE_EMULATOR_HOST, Firebase Admin SDK automatycznie łączy się z emulatorem Cloud Firestore:

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

Jeśli Twój kod jest uruchamiany w emulatorze Cloud Functions, identyfikator projektu i inne ustawienia konfiguracji są automatycznie ustawiane podczas wywoływania funkcji initializeApp.

Jeśli chcesz, by kod Admin SDK łączył się ze współdzielonym emulatorem działającym w innym środowisku, podaj ten sam identyfikator projektu, który ustawiasz za pomocą interfejsu wiersza poleceń Firebase. Możesz przekazać identyfikator projektu bezpośrednio do usługi initializeApp lub ustawić zmienną środowiskową GCLOUD_PROJECT.

Pakiet Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
Zmienna środowiskowa
export GCLOUD_PROJECT="your-project-id"

Czyszczenie bazy danych między testami

Produkcyjna wersja Firestore nie udostępnia platformy SDK z metodą czyszczenia bazy danych, ale emulator Firestore udostępnia punkt końcowy REST do tego celu, który można wywołać na etapie konfiguracji lub czyszczenia frameworku testowego, z klasy testowej lub z powłoki (np. za pomocą curl) przed rozpoczęciem testu. Możesz użyć tego podejścia zamiast po prostu zamykania procesu emulatora.

W odpowiedniej metodzie wykonaj operację usunięcia HTTP, podając identyfikator projektu Firebase, na przykład firestore-emulator-example, do następującego punktu końcowego:

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

Twój kod powinien oczekiwać potwierdzenia REST, że wyczyszczanie zostało zakończone lub nie powiodło się.

Możesz wykonać tę operację w powłoce:

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

Po zaimplementowaniu tego kroku możesz sekwencyjnie uruchamiać testy i wyzwalać funkcje, mając pewność, że stare dane zostaną usunięte między kolejnymi uruchomieniami i używasz nowej konfiguracji testu bazowego.

Importowanie i eksportowanie danych

Emulatory bazy danych i Cloud Storage for Firebase umożliwiają eksportowanie danych z bieżącej instancji emulatora. Określ podstawowy zestaw danych do użycia w testach jednostkowych lub przepływach pracy ciągłej, a następnie wyeksportuj go, aby udostępnić go zespołowi.

firebase emulators:export ./dir

Podczas testów, po uruchomieniu emulatora, zaimportuj dane bazowe.

firebase emulators:start --import=./dir

Możesz zlecić emulatorowi eksportowanie danych po wyłączeniu, określając ścieżkę eksportu lub po prostu używając ścieżki przekazanej do flagi --import.

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

Te opcje importowania i eksportowania danych działają też z poleceniem firebase emulators:exec. Więcej informacji znajdziesz w przewodniku po poleceniach emulatora.

Wizualizacja aktywności reguł zabezpieczeń

Podczas tworzenia prototypów i przeprowadzania testów możesz korzystać z wizualizacji i raportów udostępnianych przez Local Emulator Suite.

Korzystanie z monitora żądań

Emulator Cloud Firestore umożliwia wizualizację żądań klienta w Emulator Suite UI, w tym śledzenie oceny dla Firebase Security Rules.

Otwórz kartę Firestore > Żądania, aby wyświetlić szczegółową sekwencję oceny każdego żądania.

Monitor żądań w emulatorze Firestore pokazujący oceny reguł zabezpieczeń

Wizualizacja raportów oceny reguł

Gdy dodajesz do prototypu reguły zabezpieczeń, możesz je debugować za pomocą narzędzi do debugowaniaLocal Emulator Suite.

Po uruchomieniu zestawu testów możesz uzyskać dostęp do raportów o zakresie testów, które pokazują, jak oceniono każdą z reguł bezpieczeństwa.

Aby uzyskać raporty, prześlij zapytanie do punktu końcowego w emulatorze, gdy jest on uruchomiony. W przypadku wersji przeznaczonej do wyświetlania w przeglądarce użyj tego adresu URL:

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

Dzięki temu reguły są dzielone na wyrażenia i podwyrażenia, nad którymi możesz najechać kursorem, aby uzyskać więcej informacji, w tym liczbę zwracanych ocen i wartości. Aby uzyskać wersję tych danych w postaci surowych danych w formacie JSON, dodaj do zapytania ten adres URL:

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

W tym przykładzie w wersji HTML raportu wyróżnione są oceny, które generują niezdefiniowane błędy i błędy o wartości null:

Różnice między emulatorem Cloud Firestore a wersją produkcyjną

Emulator Cloud Firestore stara się wiernie odwzorowywać działanie usługi produkcyjnej, ale ma pewne istotne ograniczenia.

Obsługa wielu baz danych w Cloud Firestore

Obecnie Emulator Suite UI obsługuje interaktywne tworzenie, edytowanie, usuwanie, monitorowanie żądań i wizualizację zabezpieczeń w przypadku domyślnej bazy danych, ale nie dodatkowych nazwanych baz danych.

Jednak sam emulator tworzy nazwaną bazę danych na podstawie konfiguracji w pliku firebase.json i domyślnie w odpowiedzi na wywołania pakietu SDK lub interfejsu REST API.

Transakcje

Emulator nie implementuje obecnie wszystkich zachowań transakcji występujących w środowisku produkcyjnym. Podczas testowania funkcji, które obejmują wiele jednoczesnych zapisów w jednym dokumencie, emulacja może być powolna w wypełnianiu żądań zapisu. W niektórych przypadkach odblokowanie może potrwać do 30 sekund. W razie potrzeby dostosuj czasy oczekiwania na wyniki testów.

Indeksy

Emulator nie śledzi indeksów złożonych i zamiast tego wykonuje wszystkie prawidłowe zapytania. Aby określić, których indeksów potrzebujesz, przetestuj aplikację na prawdziwej instancji Cloud Firestore.

Limity

Emulator nie egzekwuje wszystkich limitów wymuszanych w środowisku produkcyjnym. Na przykład emulowany system może zezwalać na transakcje, które zostałyby odrzucone przez produkcyjną usługę jako zbyt duże. Zapoznaj się z ograniczeniami i zaprojektuj aplikację tak, aby ich uniknąć.

Co dalej?