Volver al blog

Flame Blog

Cómo activar manualmente Cloud Tasks en el emulador

Publicar Cloud Tasks en el emulador 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 interfaz de usuario para el emulador 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!