Usa el emulador de Firestore de forma local

Google Cloud CLI proporciona un emulador local en la memoria para Firestore que puedes usar para probar tu aplicación. Puedes usar el emulador con todas las bibliotecas cliente de Firestore. Solo debes usar el emulador para realizar pruebas locales.

No uses el emulador para implementaciones de producción. Como el emulador almacena datos solo en la memoria, no se conservarán en las ejecuciones.

Instala el emulador

Para instalar el emulador de Firestore, instala y actualiza la gcloud CLI:

  1. Instala la CLI de gcloud.

  2. Actualiza tu instalación de gcloud CLI para obtener las funciones más recientes:

    gcloud components update
    

Ejecuta el emulador

  1. Ejecuta el siguiente comando para iniciar el emulador

    gcloud emulators firestore start
    

    El emulador imprime el host y el número de puerto donde se esté ejecutando.

    De forma predeterminada, el emulador intenta usar 127.0.0.1:8080. Para vincular el emulador a un host y puerto específicos, usa la marca opcional --host-port, que reemplaza a HOST y PORT:

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Escribe Control + C para detener el emulador. El emulador también se puede detener con una solicitud POST a /shutdown. Por ejemplo:

    curl -d '' HOST:PORT/shutdown
    

Conéctate al emulador

La forma en que te conectas al emulador depende del tipo de biblioteca cliente, biblioteca cliente del servidor o SDK para dispositivos móviles o la Web.

Bibliotecas cliente del servidor

Para conectar una biblioteca cliente del servidor de Firestore (C#, Go, Java, Node.js, PHP, Python y Ruby), establece la variable de entorno FIRESTORE_EMULATOR_HOST. Cuando se establece esta variable de entorno, las bibliotecas cliente del servidor se conectan automáticamente al emulador.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

SDK para plataformas de Android y Apple y para la Web

En los siguientes ejemplos, se muestra cómo conectar los SDKs para Android, las plataformas de Apple y la Web al emulador de Firestore:

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

Web versión 9

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

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

Web versión 8

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

El emulador de Firestore en modo nativo borra el contenido de la base de datos cuando se cierra. Dado que el almacenamiento en caché sin conexión del SDK de Firestore no se borra automáticamente, te recomendamos inhabilitar la persistencia local en la configuración del emulador para evitar discrepancias entre la base de datos emulada y las cachés locales. En el caso del SDK web, la persistencia está inhabilitada de forma predeterminada.

Cómo borrar los datos del emulador

El emulador de Firestore incluye un extremo de REST para borrar todos los datos que se encuentran actualmente en el emulador. Puedes usar este extremo para borrar datos entre pruebas sin cerrar el emulador.

Para borrar todos los datos del emulador, realiza una operación DELETE de HTTP en el siguiente extremo, reemplazando HOST y PORT por el host y el puerto que seleccionaste, y reemplazando PROJECT_ID por tu propio ID del proyecto:

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

Ajusta el host y el puerto si el emulador no usa 127.0.0.1:8080. El código debe esperar la confirmación de REST de que la eliminación finalizó o falló.

Puedes realizar esta operación desde la shell con curl:

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

Diferencias entre el emulador de Firestore y el entorno de producción

El emulador de Firestore intenta replicar de la mejor forma posible el comportamiento del servicio de producción, salvo las excepciones que se indican a continuación.

Transacciones

El emulador no intenta imitar el comportamiento de las transacciones que se observa en producción. Utiliza un enfoque de bloqueo simple y no intenta reflejar los diversos modos de simultaneidad que se ofrecen en el entorno de producción.

Cuando pruebas funciones que implican varias escrituras simultáneas en un documento, es posible que el emulador tarde en completar las solicitudes de escritura. Es posible que el emulador tarde hasta 30 segundos en liberar los bloqueos. Si necesitas ajustar los intervalos de tiempo de espera de la prueba, hazlo.

El emulador tampoco intenta imitar todos los límites de producción, como los límites de tiempo de espera y tamaño, que involucran transacciones. Si pruebas funciones que dependen de estos límites de producción, te recomendamos que uses un entorno de producción en lugar de un emulador.

Índices

El emulador no realiza un seguimiento de los índices compuestos y, en su lugar, ejecutará cualquier consulta válida. Asegúrate de probar tu app con una instancia real de Firestore para determinar qué índices necesitas.

Límites

El emulador no aplica todos los límites que se implementan en producción. Por ejemplo, es posible que el emulador permita transacciones que el servicio de producción rechazaría debido a su gran tamaño. Asegúrate de conocer los límites documentados y de diseñar tu app para evitarlos de forma proactiva.