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