Retour au blog

Flame Blog

Comment déclencher manuellement des Cloud Tasks dans l'émulateur

Publier des Cloud Tasks vers l'émulateur via l'API HTTP.

Publié le 24 avril 2026

Par Val — Article original rédigé en anglais

Lorsque vous définissez des gestionnaires de files de tâches dans vos Firebase Functions, une file de tâches correspondante est automatiquement créée dans l’émulateur.

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 })
  })

L’émulateur Cloud Tasks s’exécute par défaut sur le port 9499 et vous pouvez pousser des tâches dessus en utilisant le SDK :

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

// On peut aussi utiliser la variable d'environnement `GOOGLE_CLOUD_PROJECT`
initializeApp({ projectId: 'my-project' })

process.env.CLOUD_TASKS_EMULATOR_HOST = 'localhost:9499'

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

await queue.enqueue(data)

Mais dans cet article, je veux entrer dans les détails et montrer comment créer des tâches directement en utilisant l’API HTTP de l’émulateur.

Créer une tâche

Pour pousser une tâche dans une file manuellement, faites un POST sur le point de terminaison des tâches de l’émulateur :

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 file n’est pas directement liée à la fonction, nous devons donc être explicites sur l’URL de l’émulateur de fonctions vers lequel dispatch la tâche.

Le champ body à l’intérieur de httpRequest est encodé en Base64 et la charge utile réelle doit être à l’intérieur d’un champ data. Dans cet exemple, nous passons {"data": {"foo": "bar"}}.

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

Nous pouvons inclure l’encodage Base64 dans la commande pour plus de commodité :

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"
      }
    }
  }
}'

L’émulateur dispatchera alors la tâche vers votre fonction exactement comme en production, avec les retries et tout.

Appeler la fonction directement

Puisque l’émulateur Task Queue ne fait que forwarder la requête HTTP vers l’émulateur de fonctions, vous pouvez aussi appeler la fonction directement. Dans l’exemple ci-dessus, ce serait (d’après notre guide pour appeler les fonctions de l’émulateur Firebase) :

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

Vous n’aurez pas le comportement de retry mais c’est plus rapide et vous n’avez pas besoin de l’overhead de l’API Cloud Tasks.

Flame : l’interface utilisateur manquante pour l’émulateur ✨

N’avez-vous jamais souhaité que localhost:4000 dispose d’un admin pour les files et fonctions de l’émulateur ?

C’est pourquoi nous avons construit Flame, une interface utilisateur pour l’émulateur Firebase avec tout ce qui manque à l’admin intégré.

Plus besoin de deviner avec des commandes cURL, des protocoles JSON et de l’encodage Base64 lors du débogage de vos files, tâches et Firebase Functions. Saisissez simplement votre payload et envoyez.

Composition de messages dans les files de tâches de Flame

Vient également avec une interface améliorée pour Firebase Auth, Firestore, et plus encore. Essayez-le !