HTTP リクエスト経由で関数を呼び出す

第 1 世代と同様に、onRequest() ハンドラを使用して HTTP リクエストで関数をトリガーできます。これにより、サポートされている HTTP メソッド(GETPOSTPUTDELETEOPTIONS)を使って関数を呼び出すことができます。

その他の HTTP オプション

オプション 説明
region HTTP 関数には、単一のリージョンだけでなく、リージョンの配列も指定できます。複数のリージョンが指定されている場合、リージョンごとに個別の関数インスタンスがデプロイされます。
timeoutSeconds HTTP 関数には、最大 1 時間のタイムアウトを指定できます。
cors HTTP 関数には CORS ポリシーを指定できます。これを true に設定すると、すべてのオリジンを許可できます。stringregex、または array に設定して、許可するオリジンを指定することもできます。明示的に設定しない場合、デフォルトで false/no CORS ポリシーが使用されます。

CORS(クロスオリジン リソース シェアリング)の構成

cors オプションを使用して、関数にアクセスできるオリジンを制御します。デフォルトでは、HTTP 関数に CORS は構成されていません。つまり、関数に対するクロスオリジン リクエストを行うと、次のエラーが発生します。

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

関数の cors オプションを false に設定して、CORS を明示的に無効にすることもできます。

一部のクロスオリジン リクエストを許可する場合は、許可するドメインまたは正規表現のリストを渡します。たとえば、ドメイン firebase.comflutter.com を所有していて、firebase.com に多くのサブドメインが存在する場合、cors オプションを [/firebase\.com$/, 'flutter.com'] に設定します。

関数を公開する場合は(たとえば、公開 API やウェブサイトを処理する場合)、cors ポリシーを true に設定します。

HTTP リクエストでの関数のトリガー

firebase-functions/v2/https サブパッケージの onRequest() を使用して、HTTP イベントを処理する関数を作成します。onRequest() イベントは、Express ウェブ フレームワークによって管理されるルーターとアプリをサポートします。

このページの例は、HTTP GET リクエストを関数エンドポイントに送信するときにトリガーされるタイムサーバーのサンプルに基づいています。このサンプル関数では現在のサーバー時間を取得し、URL クエリ パラメータの指定に従って形式設定したうえで、結果を HTTP レスポンスで送信しています。

Express の Request オブジェクトと Response オブジェクトの使用

onRequest() の引数として Request オブジェクトを使用すると、クライアントから送信された HTTP リクエストのプロパティにアクセスできます。Response オブジェクトを使用すると、クライアントにレスポンスを返すことができます。

exports.date = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
  // ...
});

Express の既存のアプリの使用

onRequest() の引数として App を使用すると、1 つの Express アプリ全体を HTTP 関数に渡すことができます。

const { onRequest } = require('firebase-functions/v2/https');

const express = require('express');
const app = express();

// Add middleware to authenticate requests
app.use(myMiddleware);

// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));

// Expose Express API as a single Cloud Function:
exports.widgets = onRequest(app);

HTTP 関数の呼び出し

HTTP 関数はデプロイ後、その一意の URL を使って呼び出すことができます。デプロイ後、CLI から出力された正確な URL を使用します。

たとえば、date() を呼び出す URL は次のようになります。

https://date-<random-hash>-<region>.a.run.app

Express アプリのルーティングでは、定義したアプリの URL パスに関数名が接頭辞として追加されます。

リクエストからの値の読み込み

date() 関数の例では、この関数は URL パラメータと本文の両方を format 値に対してテストし、使用する日時形式を設定します。

let format = req.query.format;
format = req.body.format;

HTTP 関数の終了

必ず send()redirect()、または end() を使用して HTTP 関数を終了してください。そうしないと、関数は引き続き実行され、システムによって強制終了される可能性があります。同期、非同期、Promise もご覧ください。

Node.js の moment モジュールによりサーバー時間を取得して形式を設定した後、その結果を HTTP レスポンスとして送信して date() 関数を終了します。

const formattedDate = moment().format(`${format}`);
logger.log("Sending formatted date:", formattedDate);
res.status(200).send(formattedDate);

Firebase Hosting との統合

HTTP 関数を Firebase Hosting に接続できます。Firebase Hosting サイトでのリクエストを特定の HTTP 関数にプロキシできます。これにより、独自のカスタム ドメインを HTTP 関数とともに使用することもできます。詳しくは、Firebase Hosting への Cloud Functions の接続についてのドキュメントをご覧ください。