コンテンツにスキップ

旧エンドポイントから移行する

概要

イベント駆動タイプのファンクションには、 旧エンドポイント トリガーがあります。このトリガーはHTTPタイプのファンクションと同様に、エンドポイントURLにHTTPリクエストを行うことでファンクションを実行できます。

HTTPタイプのファンクションはイベント駆動タイプのファンクションでエンドポイントトリガーを利用する場合に比べて、次の点で優れています。

  • より高い安定性:HTTPタイプのファンクションはエンドポイントトリガーに比べて内部コンポーネントが少なくなっています。それによってファンクション実行基盤としての安定性が向上しています。
  • レイテンシの改善:ファンクションを実行するまでの事前処理、実行後の処理を削減しているため、HTTPタイプのファンクションはエンドポイントトリガーに比べてレイテンシが低くなります。

HTTPリクエストでファンクションを実行する場合は、HTTPタイプのファンクションを利用することを推奨しています。以下では、既存のエンドポイントトリガーのファンクションをHTTPタイプのファンクションに移行する方法を説明します。

入力 ( data ) を利用する処理を書き換える

イベント駆動タイプのファンクションは、以下ページに記載の情報を data として受け取ります。ファンクション内でこれらの値を利用している場合は、適宜書き換える必要があります。

kind を使う処理は不要

data.kind はトリガーの種類に相当する情報が入ります。イベント駆動タイプのファンクションでは、data.kind が特定の値の場合に後続の処理を行うような書き方をしていました。HTTPタイプのファンクションはHTTPリクエストでのみ実行できるため、data.kind を使った処理は不要となります。

重複排除のキーとしての id は不要

イベント駆動タイプのファンクションは「少なくとも1回」の実行となるため、重複実行を排除するためのキーとして data.id が利用できました。一方、HTTPタイプのファンクションは「1回のみ」の実行となるため、重複排除処理は不要です。

ただし、ログ等の目的でリクエストを一意に判別したい場合は、リクエスト情報をハッシュ化したりuuidを発行するなどして、一意なIDを生成してください。

timestampDate.now() に置き換える

HTTPタイプのファンクションには data.timestamp に相当する情報は含まれていません。ファンクションの実行タイミングを知りたい場合は、適宜 Date.now() でタイムスタンプを設定してください。

jsonPayload の値は req から取得する

data.jsonPayload の値は、次のように req オブジェクトから取得できます。

data.jsonPayload のフィールドHTTPタイプのファンクションでのアクセス方法
jsonPayload.data.hook_data.bodyreq.body
jsonPayload.data.hook_data.endpointSuffixreq.path.split('/').slice(-1)[0]
jsonPayload.data.hook_data.ipreq.ip
jsonPayload.data.hook_data.queryreq.query
jsonPayload.data.hook_data.headersreq.headers

レスポンス処理を書き換える

エンドポイントトリガーのファンクションでは、エントリポイントで return 文を使って値を返すことでレスポンスを実現していました。一方、HTTPタイプのファンクションでは res オブジェクトを使って明示的にレスポンスを行う必要があります。HTTPタイプのファンクションに移行するためには、return で返していた値を res のメソッドとして書き換える必要があります。書き換える際の具体的な例は 必ず res で明示的にレスポンスする を参照してください。

また、エンドポイントトリガーでは、次の 特別なレスポンス 用のフィールドを返り値に入れることで、ステータスコードやリダイレクトのlocationを設定していました。

  • craft_status_code
  • craft_redirect_url

HTTPタイプのファンクションでは res オブジェクトを使ってこれらのフィールドに相当するレスポンスが行えます。

  • ステータスコードは res.status() で指定します。
  • リダイレクトを行う場合は res.redirect() でリダイレクト先を指定します。