Google Cloud 的Pub/Sub是一種全球分散式訊息總線,可根據您的需求自動擴充。您可以使用functions.pubsub
建立一個處理Pub/Sub 事件的函數。
觸發發布/訂閱功能
每當新的 Pub/Sub 訊息發送到特定主題時,您就可以觸發函數。您必須指定要觸發函數的 Pub/Sub 主題名稱,並在onPublish()
事件處理程序中設定事件:
exports.helloPubSub = functions.pubsub.topic('topic-name').onPublish((message) => { // ... });
存取 pub/sub 訊息負載 {:#access-pub/sub}
可以從返回到函數的Message
物件存取 Pub/Sub 訊息的有效負載。對於 Pub/Sub 訊息正文中包含 JSON 的訊息,適用於 Cloud Functions 的 Firebase SDK 有一個輔助屬性來解碼訊息。例如,以下是使用簡單 JSON 有效負載發布的訊息:
gcloud pubsub topics publish topic-name --message '{"name":"Xenia"}'
您可以透過json
屬性存取 JSON 資料負載,如下所示:
// 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); }
其他非 JSON 有效負載作為訊息物件中的 base64 編碼字串包含在 Pub/Sub 訊息中。要讀取如下所示的訊息,您必須對 Base64 編碼的字串進行解碼,如下所示:
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}
可以使用在發布命令中設定的資料屬性來傳送發布/訂閱訊息。例如,您可以發布帶有name
屬性的訊息:
gcloud pubsub topics publish topic-name --attribute name=Xenia
您可以從Message.attributes
讀取此類屬性:
// Get the `name` attribute of the message. const name = message.attributes.name;
您可能會注意到,一些基本資料(例如訊息 ID 或訊息發佈時間)在Message.attributes
中不可用。要解決此問題,您可以在觸發事件的EventContext
中存取這些詳細資訊。例如:
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);
});