Usar el emulador de Firestore de forma local

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

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

Instalar el emulador

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

  1. Instala gcloud CLI.

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

    gcloud components update
    

Ejecutar el emulador

  1. Ejecuta el siguiente comando para iniciar el emulador:

    gcloud emulators firestore start
    

    El emulador muestra el host y el número de puerto en los que se está ejecutando.

    De forma predeterminada, el emulador intenta usar 127.0.0.1:8080. Para vincular el emulador a un host y un puerto específicos, usa la marca opcional --host-port y sustituye 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
    

Conectarse al emulador

La forma de conectarse al emulador depende del tipo de biblioteca de cliente, biblioteca de cliente de servidor o SDK para móviles o web.

Bibliotecas de cliente del servidor

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

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

SDKs para Android, plataformas de Apple y web

En los siguientes ejemplos se muestra cómo conectar los SDKs de las plataformas Android y Apple, así como el SDK 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

Versión web 9

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

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

Versión web 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. Como la caché sin conexión del SDK de Firestore no se borra automáticamente, puede que quieras 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 SDK Web, la persistencia está inhabilitada de forma predeterminada.

Borrar datos del emulador

El emulador de Firestore incluye un endpoint REST para eliminar todos los datos que haya en el emulador. Puedes usar este endpoint para borrar datos entre pruebas sin cerrar el emulador.

Para eliminar todos los datos del emulador, realiza una operación HTTP DELETE en el siguiente endpoint. Sustituye HOST y PORT por el host y el puerto que hayas seleccionado, y PROJECT_ID por tu ID de 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. Tu código debe esperar la confirmación de REST de que la eliminación se ha completado o ha fallado.

Puedes realizar esta operación desde el 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 la producción

El emulador de Firestore intenta replicar fielmente el comportamiento del servicio de producción, pero tiene algunas limitaciones importantes.

Transacciones

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

Cuando pruebes funciones que impliquen varias escrituras simultáneas en un documento, es posible que el emulador tarde en completar las solicitudes de escritura. El emulador puede tardar 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 de tamaño, que implican transacciones. Si pruebas funciones que dependen de estos límites de producción, te recomendamos que utilices un entorno de producción en lugar de un emulador.

Índices

El emulador no monitoriza los índices compuestos, sino que ejecuta cualquier consulta válida. Asegúrate de probar tu aplicación con una instancia real de Firestore para determinar qué índices necesitas.

Límites

El emulador no aplica todos los límites que se aplican en producción. Por ejemplo, el emulador puede permitir transacciones que el servicio de producción rechazaría por ser demasiado grandes. Familiarízate con los límites documentados y diseña tu aplicación para evitarlos de forma proactiva.