Flame Blog
Como acionar manualmente Cloud Tasks no emulador
Publicando Cloud Tasks no emulador via API HTTP.
Publicado em 24 de abril de 2026
Por Val — Artigo original escrito em inglês
Quando você define handlers de filas de tarefas nas suas Firebase Functions, uma fila de tarefas correspondente é criada automaticamente no 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 })
}) O emulador Cloud Tasks roda por padrão na porta 9499 e você pode enviar tarefas para ele usando o SDK:
import { initializeApp } from 'firebase-admin/app'
import { getFunctions } from 'firebase-admin/functions'
// Também é possível usar a variável de ambiente `GOOGLE_CLOUD_PROJECT`
initializeApp({ projectId: 'my-project' })
process.env.CLOUD_TASKS_EMULATOR_HOST = 'localhost:9499'
const queue = getFunctions().taskQueue('taskQueueFunction')
await queue.enqueue(data)
Mas neste artigo eu quero entrar em detalhes e mostrar como criar tarefas diretamente usando a API HTTP do emulador.
Criar uma tarefa
Para enviar uma tarefa para uma fila manualmente, faça um POST no endpoint de tarefas do 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"
}
}
}
}'
A fila não está diretamente vinculada à função, então precisamos ser explícitos sobre a URL do emulador de funções para onde a tarefa será enviada.
O campo body dentro de httpRequest é codificado em Base64 e o payload real precisa estar dentro de um campo data. Neste exemplo estamos passando {"data": {"foo": "bar"}}.
Buffer.from(JSON.stringify({ data: { foo: 'bar' } })).toString('base64')
// 'eyJkYXRhIjp7ImZvbyI6ImJhciJ9fQ=='
Podemos incluir a codificação Base64 no mesmo comando para conveniência:
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"
}
}
}
}'
O emulador então despachará a tarefa para sua função exatamente como faria em produção, com retries e tudo.
Chamar a função diretamente
Como o emulador Task Queue apenas encaminha a requisição HTTP para o emulador de funções, você também pode chamar a função diretamente. No exemplo acima, isso seria (do nosso guia para chamar funções do emulador Firebase):
curl -X POST 'http://localhost:5001/my-project/us-central1/taskQueueFunction' \
-H 'Content-Type: application/json' \
-d '{"data": {"foo": "bar"}}'
Você não terá o comportamento de retry, mas é mais rápido e você não precisa do overhead da API Cloud Tasks.
Flame: a interface de usuário que falta para o emulador ✨
Você já desejou que localhost:4000 tivesse um admin para as filas e funções do emulador?
É por isso que construímos o Flame, uma interface de usuário para o emulador Firebase com tudo o que falta ao admin integrado.
Nada mais de adivinhação com comandos cURL, protocolos JSON e codificação Base64 ao depurar suas filas, tarefas e Firebase Functions. Apenas insira seu payload e envie.
Também vem com uma interface melhorada para Firebase Auth, Firestore, e mais. Experimente!