第 1 世代と同様に、onRequest()
ハンドラを使用して HTTP リクエストで関数をトリガーできます。これにより、サポートされている HTTP メソッド(GET
、POST
、PUT
、DELETE
、OPTIONS
)を使って関数を呼び出すことができます。
その他の HTTP オプション
オプション | 説明 |
---|---|
region |
HTTP 関数には、単一のリージョンだけでなく、リージョンの配列も指定できます。複数のリージョンが指定されている場合、リージョンごとに個別の関数インスタンスがデプロイされます。 |
timeoutSeconds |
HTTP 関数には、最大 1 時間のタイムアウトを指定できます。 |
cors |
HTTP 関数には CORS ポリシーを指定できます。これを true に設定すると、すべてのオリジンを許可できます。string 、regex 、または 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.com
と flutter.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 の接続についてのドキュメントをご覧ください。