Pub/Sub triggers


Google Cloud's Pub/Sub is a globally distributed message bus that automatically scales as you need it. You can create a function that handles Pub/Sub events by using functions.pubsub.

Trigger a pub/sub function

You can trigger a function whenever a new Pub/Sub message is sent to a specific topic. You must specify the Pub/Sub topic name that you want to trigger your function, and set the event within the onPublish() event handler:

exports.helloPubSub = functions.pubsub.topic('topic-name').onPublish((message) => {
  // ...
});

Access the pub/sub message payload {:#access-pub/sub}

The payload for the Pub/Sub message is accessible from the Message object returned to your function. For messages with JSON in the Pub/Sub message body, the Firebase SDK for Cloud Functions has a helper property to decode the message. For example, here is a message published with a simple JSON payload:

gcloud pubsub topics publish topic-name --message '{"name":"Xenia"}'

You can access a JSON data payload like this via the json property:

  // Get the `name` attribute of the PubSub message JSON body.
  let name = null;
  try {
    name = message.json.name;
  } catch (e) {
    functions.logger.error('PubSub message was not JSON', e);
  }

Other, non-JSON payloads are contained in the Pub/Sub message as base64 encoded strings in the message object. To read a message like the following, you must decode the base64 encoded string as shown:

gcloud pubsub topics publish topic-name --message 'MyMessage'

// Decode the PubSub Message body.
const messageBody = message.data ? Buffer.from(message.data, 'base64').toString() : null;

Access message attributes {:#access-message}

Pub/Sub message can be sent with data attributes set in the publish command. For example, you could publish a message with a name attribute:

gcloud pubsub topics publish topic-name --attribute name=Xenia

You can read such attributes from Message.attributes:

// Get the `name` attribute of the message.
const name = message.attributes.name;

You might notice that some basic data such as the message ID or the message publish time are not available in Message.attributes. To work around this, you can access these details in the triggering event's EventContext. For example:

exports.myFunction = functions.pubsub.topic('topic1').onPublish((message, context) => {
    console.log('The function was triggered at ', context.timestamp);
    console.log('The unique ID for the event is', context.eventId);
});