Google Cloud Pub/Sub is a globally
distributed message
bus that automatically scales as you need it. You can create a
function that handles Google Cloud 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
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) {
console.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
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 the triggering event's
context.eventId and
context.timestamp,
with which you can determine when any message was published
and differentiate one message from another. 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);
});

