Pub/Sub 觸發器


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