Flame Blog
So lösen Sie Cloud Tasks manuell im Emulator aus
Veröffentlichen von Cloud Tasks an den Emulator über die HTTP-API.
Veröffentlicht am 24. April 2026
Von Val — Ursprünglich auf Englisch verfasst
Wenn Sie Task-Queue-Handler in Ihren Firebase Functions definieren, wird automatisch eine entsprechende Task-Warteschlange im Emulator erstellt.
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 })
}) Der Cloud Tasks-Emulator läuft standardmäßig auf Port 9499 und Sie können Tasks mit dem SDK pushen:
import { initializeApp } from 'firebase-admin/app'
import { getFunctions } from 'firebase-admin/functions'
// Es kann auch die Umgebungsvariable `GOOGLE_CLOUD_PROJECT` verwendet werden
initializeApp({ projectId: 'my-project' })
process.env.CLOUD_TASKS_EMULATOR_HOST = 'localhost:9499'
const queue = getFunctions().taskQueue('taskQueueFunction')
await queue.enqueue(data)
Aber in diesem Beitrag möchte ich ins Detail gehen und zeigen, wie man Tasks direkt über die HTTP-API des Emulators erstellt.
Eine Task erstellen
Um eine Task manuell in eine Warteschlange zu pushen, POSTen Sie an den Tasks-Endpunkt des Emulators:
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"
}
}
}
}'
Die Warteschlange ist nicht direkt mit der Funktion verknüpft, daher müssen wir explizit die URL zum Functions-Emulator angeben, an den die Task dispatched wird.
Das Feld body innerhalb von httpRequest ist Base64-kodiert und die tatsächliche Nutzlast muss in einem data-Feld enthalten sein. In diesem Beispiel übergeben wir {"data": {"foo": "bar"}}.
Buffer.from(JSON.stringify({ data: { foo: 'bar' } })).toString('base64')
// 'eyJkYXRhIjp7ImZvbyI6ImJhciJ9fQ=='
Wir können die Base64-Kodierung im Befehl inline für mehr Komfort durchführen:
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"
}
}
}
}'
Der Emulator wird dann die Task an Ihre Function dispatch, genau wie in der Produktion, mit Retries und allem.
Die Function direkt aufrufen
Da der Task-Queue-Emulator nur die HTTP-Anfrage an den Functions-Emulator weiterleitet, können Sie auch die Function direkt aufrufen. Im obigen Beispiel wäre das (aus unserer Anleitung zum Aufrufen von Firebase-Emulator-Funktionen):
curl -X POST 'http://localhost:5001/my-project/us-central1/taskQueueFunction' \
-H 'Content-Type: application/json' \
-d '{"data": {"foo": "bar"}}'
Sie erhalten zwar kein Retry-Verhalten, aber es ist schneller und Sie benötigen keinen Cloud Tasks API-Overhead.
Flame: die fehlende Benutzeroberfläche für den Emulator ✨
Haben Sie sich jemals gewünscht, dass localhost:4000 einen Admin für die Emulator-Warteschlangen und -Funktionen hätte?
Deshalb haben wir Flame gebaut, eine Firebase-Emulator-Benutzeroberfläche mit allem, was der integrierte Admin nicht bietet.
Kein Raten mehr mit cURL-Befehlen, JSON-Protokollen und Base64-Kodierung beim Debuggen Ihrer Warteschlangen, Tasks und Firebase Functions. Geben Sie einfach Ihre Nutzlast ein und senden Sie ab.
Kommt auch mit einer verbesserten Benutzeroberfläche für Firebase Auth, Firestore und mehr. Probieren Sie es aus!