Voltar ao blog

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.

Composição de mensagens em filas de tarefas no Flame

Também vem com uma interface melhorada para Firebase Auth, Firestore, e mais. Experimente!