Zurück zum Blog

Flame Blog

So veröffentlichen Sie manuell Nachrichten im Pub/Sub-Emulator

Direkter Aufruf des Pub/Sub-Emulators über die HTTP-API.

Veröffentlicht am 24. April 2026

Von Val — Ursprünglich auf Englisch verfasst

Wenn Sie Pub/Sub-Funktionen definieren, wird automatisch ein entsprechendes Topic im Emulator bereitgestellt.

export const pubsubFunction = functions.pubsub.onMessagePublished(
  { topic: 'my-topic' },
  event => {
    console.log({ event, json: event.data.message.json })
  }
)
export const pubsubFunction = functions.pubsub
  .topic('my-topic')
  .onPublish(message => {
    console.log({ message, json: message.json })
  })

Der Pub/Sub-Emulator läuft standardmäßig auf Port 8085 und Sie können Nachrichten mit dem Pub/Sub-SDK in Ihrer bevorzugten Sprache veröffentlichen, z. B.:

import { PubSub } from '@google-cloud/pubsub'

const pubsub = new PubSub({
  projectId: 'my-project',
  apiEndpoint: 'localhost:8085',
})

// Es kann auch ein leerer Konstruktor mit den Umgebungsvariablen
// `GOOGLE_CLOUD_PROJECT` und `PUBSUB_EMULATOR_HOST` verwendet werden.
// const pubsub = new PubSub()

const topic = pubsub.topic('my-topic')

await topic.publishMessage({
  json: {
    foo: 'bar',
  },
})

Aber in diesem Beitrag möchte ich ins Detail gehen und zeigen, wie man die HTTP-API des Emulators direkt verwendet.

Eine Nachricht veröffentlichen

Um eine Nachricht zu einem Topic zu veröffentlichen, verwenden Sie den :publish-Endpunkt:

curl -X POST 'http://127.0.0.1:8085/v1/projects/my-project/topics/my-topic:publish' \
  -H 'Content-Type: application/json' \
  -d '{"messages": [{"data": "eyJmb28iOiJiYXIifQ=="}]}'

Das Feld data innerhalb jeder Nachricht muss Base64-kodiert sein. Hier ist die Nutzlast {"foo": "bar"}.

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

Um die Base64-Kodierung im selben Befehl zu handhaben, können wir Folgendes tun:

curl -X POST 'http://127.0.0.1:8085/v1/projects/my-project/topics/my-topic:publish' \
  -H 'Content-Type: application/json' \
  -d '{"messages": [{"data": "'$(echo '{"foo": "bar"}' | base64)'"}]}'

Sie können auch Nachrichtenattribute einfügen:

curl -X POST "http://127.0.0.1:8085/v1/projects/my-project/topics/my-topic:publish" \
  -H "Content-Type: application/json" \
  -d '{
  "messages": [
    {
      "data": "eyJmb28iOiJiYXIifQ==",
      "attributes": {
        "foo": "bar"
      }
    }
  ]
}'

Der Endpunkt gibt die Nachrichten-IDs der veröffentlichten Nachrichten zurück:

{
  "messageIds": ["1"]
}

Die zugrundeliegende Funktion direkt aufrufen

Wenn Sie den Pub/Sub-Emulator vollständig umgehen und direkt die Funktion hinter dem Topic aufrufen möchten, lesen Sie unsere detaillierte Anleitung zum Aufrufen von Firebase-Emulator-Funktionen.

Hören Sie auf zu raten mit Flame ✨

Vielleicht möchten Sie sich nicht mit cURL-Befehlen und Base64-Kodierung herumschlagen, wenn Sie Ihre Pub/Sub-Funktionen debuggen.

Deshalb haben wir Flame gebaut, eine Firebase-Emulator-Benutzeroberfläche mit allem, was auf localhost:4000 fehlt.

Sehen Sie auf einen Blick alle Ihre Pub/Sub-Topics und Task-Warteschlangen, erstellen Sie Nachrichten mit einer benutzerfreundlichen Oberfläche, und veröffentlichen Sie direkt im Emulator. Keine Base64-Kodierung erforderlich.

Pub/Sub-Topics und Nachrichtenerstellung in Flame

Flame bietet Ihnen die Pub/Sub-Oberfläche, die auf localhost:4000 fehlt, und kommt auch mit einer verbesserten Benutzeroberfläche für Firebase Auth, Firestore, Functions und mehr.

Wenn das für Sie spannend klingt, probieren Sie Flame aus!