Volver al blog

Cómo activar manualmente Cloud Tasks en el emulador de Firebase

Publicar Cloud Tasks en el emulador de Firebase a través de la API HTTP.

Publicado el 24 de abril de 2026

Por Val — Artículo original escrito en inglés

Cuando defines controladores de colas de tareas en tus Firebase Functions, una cola de tareas correspondiente se crea automáticamente en el emulador.

export const taskQueueFunction = functions.tasks.onTaskDispatched(
  {
    retryConfig: {
      maxAttempts: 5,
      minBackoffSeconds: 60,
    },
    rateLimits: {
      maxConcurrentDispatches: 6,
    },
  },
  async request => {
    console.log({ data: request.data })
  }
)
export const taskQueueFunction = functions.tasks
  .taskQueue({
    retryConfig: {
      maxAttempts: 5,
      minBackoffSeconds: 60,
    },
    rateLimits: {
      maxConcurrentDispatches: 6,
    },
  })
  .onDispatch(async data => {
    console.log({ data })
  })

El emulador de Cloud Tasks se ejecuta por defecto en el puerto 9499 y puedes enviar tareas a él usando el SDK:

import { initializeApp } from 'firebase-admin/app'
import { getFunctions } from 'firebase-admin/functions'

// También se puede usar la variable de entorno `GOOGLE_CLOUD_PROJECT`
initializeApp({ projectId: 'my-project' })

process.env.CLOUD_TASKS_EMULATOR_HOST = 'localhost:9499'

const queue = getFunctions().taskQueue('taskQueueFunction')

await queue.enqueue(data)

Pero en este artículo quiero entrar en detalles y mostrar cómo crear tareas directamente usando la API HTTP del emulador.

Crear una tarea

Para enviar una tarea a una cola manualmente, haz un POST al endpoint de tareas del emulador:

curl -X POST 'http://localhost:9499/projects/my-project/locations/us-central1/queues/taskQueueFunction/tasks' \
  -H 'Content-Type: application/json' \
  -d '{
  "task": {
    "httpRequest": {
      "httpMethod": "POST",
      "url": "http://localhost:5001/my-project/us-central1/taskQueueFunction",
      "body": "eyJkYXRhIjp7ImZvbyI6ImJhciJ9fQ==",
      "headers": {
        "Content-Type": "application/json"
      }
    }
  }
}'

La cola no está directamente vinculada a la función, por lo que debemos ser explícitos sobre la URL del emulador de funciones al que enviar la tarea.

El campo body dentro de httpRequest está codificado en Base64 y la carga útil real debe estar dentro de un campo data. En este ejemplo estamos pasando {"data": {"foo": "bar"}}.

Buffer.from(JSON.stringify({ data: { foo: 'bar' } })).toString('base64')
// 'eyJkYXRhIjp7ImZvbyI6ImJhciJ9fQ=='

Podemos incluir la codificación Base64 en el comando para mayor comodidad:

curl -X POST 'http://localhost:9499/projects/my-project/locations/us-central1/queues/taskQueueFunction/tasks' \
  -H 'Content-Type: application/json' \
  -d '{
  "task": {
    "httpRequest": {
      "httpMethod": "POST",
      "url": "http://localhost:5001/my-project/us-central1/taskQueueFunction",
      "body": "'$(echo '{"data": {"foo": "bar"}}' | base64)'",
      "headers": {
        "Content-Type": "application/json"
      }
    }
  }
}'

El emulador entonces enviará la tarea a tu función tal como lo haría en producción, con reintentos y todo.

Llamar a la función directamente

Dado que el emulador de Task Queue solo reenvía la solicitud HTTP al emulador de funciones, también puedes llamar a la función directamente. En el ejemplo anterior, eso sería (de nuestra guía para llamar funciones del emulador Firebase):

curl -X POST 'http://localhost:5001/my-project/us-central1/taskQueueFunction' \
  -H 'Content-Type: application/json' \
  -d '{"data": {"foo": "bar"}}'

No obtendrás el comportamiento de reintentos pero es más rápido y no necesitas el overhead de la API de Cloud Tasks.

Flame: la interfaz de usuario que falta para el emulador ✨

¿Alguna vez deseaste que localhost:4000 tuviera un admin para las colas y funciones del emulador?

Por eso construimos Flame, una GUI de Firebase con todo lo que le falta al admin integrado.

No más conjeturas con comandos cURL, protocolos JSON y codificación Base64 al depurar tus colas, tareas y Firebase Functions. Solo ingresa tu payload y envía.

Composición de mensajes en colas de tareas de Flame

También viene con una interfaz mejorada para Firebase Auth, Firestore, y más. ¡Pruébalo!