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.
También viene con una interfaz mejorada para Firebase Auth, Firestore, y más. ¡Pruébalo!