La CLI de Google Cloud proporciona un emulador local en memoria de Firestore que puedes usar para probar tu aplicación de Firestore en el modo de Datastore. Puedes usar el emulador con todas las bibliotecas de cliente del modo Datastore. Solo debes usar el emulador para hacer pruebas locales.
Usa gcloud emulators firestore
con --database-mode=datastore-mode
para probar el comportamiento de Firestore en modo Datastore.
No uses el emulador para las implementaciones de producción. Como el emulador solo almacena datos en la memoria, no conserva los datos entre ejecuciones.
Instalar el emulador
Para instalar el emulador de Firestore, instala y actualiza la CLI de gcloud:
Actualiza tu instalación de gcloud CLI para obtener las funciones más recientes:
gcloud components update
Ejecutar el emulador
Ejecuta el siguiente comando para iniciar el emulador:
gcloud emulators firestore start --database-mode=datastore-mode
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 --database-mode=datastore-mode --host-port=HOST:PORT
Usa la combinación de teclas
Control + C
para detener el emulador.
Conectarse al emulador
Para conectar una biblioteca de cliente y una aplicación al emulador, define la variable de entorno DATASTORE_EMULATOR_HOST
. Cuando se define esta variable de entorno, las bibliotecas de cliente se conectan automáticamente al emulador.
export DATASTORE_EMULATOR_HOST="HOST:PORT"
Importar entidades al emulador
La función de importación del emulador te permite cargar entidades de un conjunto de archivos de exportación de entidades en el emulador. Los archivos de exportación de entidades pueden proceder de una exportación de tu base de datos en modo Datastore o de una instancia de emulador.
Puedes importar entidades al emulador de dos formas. La primera es añadir la marca import-data
al comando de inicio del emulador. El segundo método consiste en enviar una solicitud de importación POST al emulador. Puedes usar curl o una herramienta similar. Consulta los siguientes ejemplos.
Protocolo
curl -X POST http://localhost:8080/emulator/v1/projects/PROJECT_ID:import \ -H 'Content-Type: application/json' \ -d '{"database":"DATABASE", "export_directory":"EXPORT_DIRECTORY"}'
localhost:8080
si el emulador usa otro puerto.Marca de CLI
gcloud emulators firestore start --database-mode=datastore-mode --import-data=EXPORT_DIRECTORY
donde:
[PROJECT_ID]
es el ID de tu proyecto.[DATABASE]
es la ruta de la base de datos. Por ejemplo, un proyecto con una base de datos predeterminada tendría el siguiente aspecto:{"database":"projects/myProject/databases/"}
[EXPORT_DIRECTORY]
es la ruta al archivooverall_export_metadata
de los archivos de exportación de tu entidad. Por ejemplo:{"export_directory":"/home/user/myexports/2024-03-26T19:39:33_443/2024-03-26T19:39:33_443.overall_export_metadata"}
Exportar entidades en el emulador
La función de exportación del emulador te permite guardar entidades del emulador en un conjunto de archivos de exportación de entidades. Después, puedes usar una operación de importación para cargar las entidades de los archivos de exportación de entidades en tu base de datos en modo Datastore o en una instancia del emulador.
Puedes exportar entidades del emulador de dos formas. La primera es añadir la marca export-on-exit
al comando de inicio del emulador. El segundo método consiste en enviar una solicitud de exportación POST
al emulador. Puedes usar curl o una herramienta similar. Consulta los siguientes ejemplos.
Protocolo
curl -X POST http://localhost:8080/emulator/v1/projects/PROJECT_ID:export \ -H 'Content-Type: application/json' \ -d '{"database":"DATABASE_PATH", "export_directory":"EXPORT_DIRECTORY"}'
localhost:8080
si el emulador usa otro puerto.Marca de CLI
gcloud emulators firestore start --database-mode=datastore-mode --export-on-exit=EXPORT_DIRECTORY
donde:
[PROJECT_ID]
es el ID de tu proyecto.[DATABASE_PATH]
es la ruta de la base de datos. Por ejemplo, un proyecto con una base de datos predeterminada tendría el siguiente aspecto:{"database":"projects/myProject/databases/"}
[EXPORT_DIRECTORY]
especifica el directorio en el que el emulador guarda los archivos de exportación de entidades. Este directorio no debe contener ya un conjunto de archivos de exportación de entidades. Por ejemplo:{"export_directory":"/home/user/myexports/2024-03-26/"}
Conservar los datos en el emulador
De forma predeterminada, el emulador de Firestore no conserva los datos en el disco. Para conservar los datos del emulador, ejecuta el siguiente comando para usar las marcas de importación y exportación con el fin de cargar y guardar los datos en las instancias del emulador:
gcloud emulators firestore start --database-mode=datastore-mode --import-data=EXPORT_DIRECTORY --export-on-exit=EXPORT_DIRECTORY
Borrar datos del emulador
El emulador de Firestore incluye un endpoint REST para restablecer todos los datos del emulador. Puedes usar este endpoint para borrar datos entre pruebas sin cerrar el emulador.
Para restablecer todos los datos del emulador, realiza una operación HTTP POST
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/reset
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 el restablecimiento se ha completado o ha fallado.
Puedes realizar esta operación desde la shell con curl
:
$ curl -X POST "http://HOST:PORT/reset"
Diferencias entre el emulador y la producción
El emulador intenta replicar fielmente el comportamiento del servicio de producción, pero tiene algunas limitaciones importantes.
Simultaneidad y coherencia
El emulador solo admite la simultaneidad pesimista y la coherencia fuerte. El emulador no admite la configuración de concurrencia optimista y coherencia final.
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 del modo Datastore 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.
Siguientes pasos
- Consulta cómo trabajar con entidades, propiedades y claves.
- Información sobre las consultas