透過 Cloud Functions 提供動態內容和託管微服務

Cloud FunctionsFirebase Hosting 配對,即可產生及提供動態內容,或將 REST API 建構為微服務。

Cloud Functions for Firebase 可讓您自動依據 HTTPS 要求執行後端程式碼。您的程式碼會儲存在 Google 的雲端服務中,並且會在代管環境中執行。您不必管理及擴充自己的伺服器。

如需與 Firebase Hosting 整合的 Cloud Functions 範例用途和範例,請參閱無伺服器總覽

Cloud Functions 連接至 Firebase Hosting

本節提供逐步解說範例,說明如何將函式連結至 Firebase Hosting

請注意,如要提升放送動態內容的效能,您可以視需要調整快取設定

步驟 1:設定 Cloud Functions

  1. 確認您使用的是最新版 Firebase CLI,且已初始化 Firebase Hosting

    如需安裝 CLI 和初始化 Hosting 的詳細操作說明,請參閱 Hosting 入門指南

  2. 請確認您已設定 Cloud Functions

    • 如果您設定 Cloud Functions,請繼續執行步驟 2:建立及測試 HTTPS 函式

    • 如果尚未設定 Cloud Functions

      1. 從專案目錄的根目錄執行下列指令,初始化 Cloud Functions

        firebase init functions
      2. 系統顯示提示時,請選取 JavaScript (本逐步解說範例使用 JS)。

      3. 確認本機專案目錄中是否有 functions 目錄 (由您剛執行的 Firebase 指令建立)。functions 目錄是 Cloud Functions 程式碼的所在位置。

步驟 2:Hosting網站建立及測試 HTTPS 函式

  1. 在偏好的編輯器中開啟 /functions/index.js

  2. 將檔案內容替換成下列程式碼。

    這段程式碼會建立 HTTPS 函式 (名為 bigben),並在收到 HTTPS 要求時,傳回當下的小時數 (BONG),就像時鐘一樣。

    const functions = require('firebase-functions/v1');
    
    exports.bigben = functions.https.onRequest((req, res) => {
      const hours = (new Date().getHours() % 12) + 1  // London is UTC + 1hr;
      res.status(200).send(`<!doctype html>
        <head>
          <title>Time</title>
        </head>
        <body>
          ${'BONG '.repeat(hours)}
        </body>
      </html>`);
    });
    
  3. 使用 Firebase Local Emulator Suite 在本機測試函式。

    1. 在本機專案目錄的根目錄中,執行下列指令:

      firebase emulators:start
    2. 透過 CLI 傳回的本機網址存取函式,例如:http://localhost:5001/PROJECT_ID/us-central1/bigben

如要進一步瞭解 HTTPS 要求,請參閱 Cloud Functions 說明文件

下一個步驟將說明如何透過 Firebase Hosting 網址存取這個 HTTPS 函式,以便為 Firebase 託管網站產生動態內容。

步驟 3:將 HTTPS 要求直接傳送至函式

使用重寫規則,您可以將符合特定模式的要求導向單一目的地。下列步驟說明如何將 Hosting 網站上路徑 ../bigben 的所有要求,導向執行 bigben 函式。

  1. 開啟 firebase.json 檔案

  2. hosting 區段下方新增下列 rewrite 設定:

    "hosting": {
      // ...
    
      // Add the "rewrites" attribute within "hosting"
      "rewrites": [ {
        "source": "/bigben",
        "function": {
          "functionId": "bigben",
          "region": "us-central1"  // optional (see note below)
          "pinTag": true           // optional (see note below)
        }
      } ]
    }
    
  3. 使用 Firebase 模擬器再次測試,確認重新導向功能是否正常運作。

    1. 在本機專案目錄的根目錄中,執行下列指令:

      firebase emulators:start
    2. 前往 CLI 傳回的網站本機代管網址 (通常為 localhost:5000),但請在網址後方附加 bigben,如下所示: http://localhost:5000/bigben

  4. 反覆調整函式和網站功能。使用 Firebase 模擬器測試這些疊代版本。

為獲得最佳效能,請選擇下列其中一個區域,將函式與 Hosting 放在同一位置:

  • us-west1
  • us-central1
  • us-east1
  • europe-west1
  • asia-east1

如要進一步瞭解重寫規則,請前往 Hosting 設定頁面。您也可以瞭解各種Hosting設定的回覆優先順序

請注意,如要提升放送動態內容的效能,您可以視需要調整快取設定

步驟 4:部署函式

確認函式在模擬器中運作正常後,即可繼續使用實際專案資源部署、測試及執行函式。此時很適合考慮設定執行階段選項,控管在正式環境中執行的函式的縮放行為

  1. 如要將函式和 Hosting 內容及設定部署至網站,請在本地專案目錄的根目錄中執行下列指令:

    firebase deploy --only functions,hosting
  2. 透過下列網址存取上線網站和函式:

    • 您的 Firebase 子網域:
      PROJECT_ID.web.app/bigbenPROJECT_ID.firebaseapp.com/bigben

    • 任何已連結的自訂網域
      CUSTOM_DOMAIN/bigben

使用網頁架構

您可以在 Cloud Functions 中使用 Express.js 等網路架構,輕鬆提供應用程式的動態內容,以及撰寫複雜的網路應用程式。

以下章節提供逐步操作範例,說明如何搭配使用 Express.js、Firebase HostingCloud Functions

  1. functions 目錄中執行下列指令,在本機專案中安裝 Express.js:

    npm install express --save
  2. 開啟 /functions/index.js 檔案,然後匯入並初始化 Express.js:

    const functions = require('firebase-functions/v1');
    const express = require('express');
    const app = express();
  3. 新增下列兩個端點:

    1. / 新增第一個端點,用於提供網站的索引。

      app.get('/', (req, res) => {
        const date = new Date();
        const hours = (date.getHours() % 12) + 1;  // London is UTC + 1hr;
        res.send(`
          <!doctype html>
          <head>
            <title>Time</title>
            <link rel="stylesheet" href="/style.css">
            <script src="/script.js"></script>
          </head>
          <body>
            <p>In London, the clock strikes:
              <span id="bongs">${'BONG '.repeat(hours)}</span></p>
            <button onClick="refresh(this)">Refresh</button>
          </body>
        </html>`);
      });
      
    2. 另一個端點則會以 JSON 格式,在 /api 下方以 API 形式傳回 BONG 計數:

      app.get('/api', (req, res) => {
        const date = new Date();
        const hours = (date.getHours() % 12) + 1;  // London is UTC + 1hr;
        res.json({bongs: 'BONG '.repeat(hours)});
      });
      
  4. 將 Express.js 應用程式匯出為 HTTPS 函式:

    exports.app = functions.https.onRequest(app);
  5. firebase.json 檔案中,將所有要求導向 app 函式。 這項重寫作業可讓 Express.js 提供我們設定的不同子路徑 (在本例中為 //api)。

    {
     "hosting": {
       // ...
    
       // Add the "rewrites" attribute within "hosting"
       "rewrites": [ {
         "source": "**",
         "function": "app"
       } ]
     }
    }

新增中介軟體

繼續以我們的範例為例,現在您使用的是 Express.js,因此可以透過一般方式新增 Express.js 中介軟體。舉例來說,您可以在端點上啟用 CORS 要求。

  1. 執行下列指令,安裝 cors 中介軟體:

    npm install --save cors
  2. 開啟 /functions/index.js 檔案,然後將 cors 新增至 Express.js 應用程式,如下所示:

    const cors = require('cors')({origin: true});
    app.use(cors);

如要進一步瞭解如何搭配使用 Firebase 與 Express 應用程式和中介軟體模組,請參閱Cloud Functions說明文件

後續步驟