Volver al blog

Flame Blog

Cómo publicar manualmente mensajes en el emulador de Pub/Sub

Llamar al emulador de Pub/Sub directamente a través de la API HTTP.

Publicado el 24 de abril de 2026

Por Val — Artículo original escrito en inglés

Cuando defines funciones de Pub/Sub, un topic correspondiente se provisiona automáticamente en el emulador.

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

El emulador de Pub/Sub se ejecuta por defecto en el puerto 8085 y puedes publicar mensajes en él usando el SDK de Pub/Sub en tu lenguaje favorito, por ejemplo:

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

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

// También se puede usar un constructor vacío con las variables de entorno
// `GOOGLE_CLOUD_PROJECT` y `PUBSUB_EMULATOR_HOST` definidas.
// const pubsub = new PubSub()

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

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

Pero en este artículo quiero entrar en detalles y mostrar cómo usar directamente la API HTTP del emulador.

Publicar un mensaje

Para publicar un mensaje en un topic, usa el endpoint :publish:

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

El campo data dentro de cada mensaje debe estar codificado en Base64. Aquí, la carga útil es {"foo": "bar"}.

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

Para manejar la codificación Base64 en el mismo comando, podemos hacer lo siguiente:

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

También puedes incluir atributos de mensaje:

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

El endpoint devolverá los IDs de los mensajes publicados:

{
  "messageIds": ["1"]
}

Llamar a la función subyacente directamente

Si quieres omitir completamente el emulador de Pub/Sub y llamar directamente a la función detrás del topic, consulta nuestra guía dedicada para llamar funciones del emulador Firebase.

Deja de adivinar con Flame ✨

Quizás no quieras complicarte con comandos cURL y codificación Base64 al depurar tus funciones de Pub/Sub.

Por eso construimos Flame, una interfaz de usuario para el emulador de Firebase con todo lo que le falta a localhost:4000.

Ve todos tus topics de Pub/Sub y colas de tareas de un vistazo, compón mensajes con una interfaz amigable, y publica directamente en el emulador. Sin codificación Base64 necesaria.

Topics de Pub/Sub y composición de mensajes en Flame

Flame te ofrece la interfaz de Pub/Sub que le falta a localhost:4000, y también viene con una interfaz mejorada para Firebase Auth, Firestore, Functions, y más.

Si eso te parece interesante, ¡prueba Flame!