Firebase is back at Google I/O on May 10! Register now

通過 HTTP 請求調用函數

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

與第一代一樣,您可以使用onRequest()處理程序通過 HTTP 請求觸發函數。這允許您通過以下受支持的 HTTP 方法調用函數: GETPOSTPUTDELETEOPTIONS

額外的 HTTP 選項

選項描述
region HTTP 函數可以指定區域數組以及單個區域。當指定多個區域時,將為每個區域部署一個單獨的功能實例。
timeoutSeconds HTTP 函數可以指定最多一小時的超時。
cors HTTP 函數可以指定 CORS 策略。您可以將其設置為true以允許所有來源或stringregexarray來指定允許的來源。如果未明確設置,則默認為 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 Web 框架管理的路由器和應用程序。

此頁面中的示例基於時間服務器示例,該示例在您向函數端點發送 HTTP GET請求時觸發。示例函數檢索當前服務器時間,按照 URL 查詢參數中指定的格式設置時間格式,然後在 HTTP 響應中發送結果。

使用 Express 請求和響應對象

作為onRequest()的參數, Request對象使您可以訪問客戶端發送的 HTTP 請求的屬性, Response對象為您提供了一種將響應發送回客戶端的方法。

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

使用現有的 Express 應用程序

使用App作為onRequest()的參數,您可以將完整的 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 函數。否則,您的函數可能會繼續運行並被系統強行終止。另請參閱同步、異步和承諾

使用 Node.js moment模塊檢索和格式化服務器時間後, date()函數通過在 HTTP 響應中發送結果來結束:

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

與 Firebase 託管集成

您可以將 HTTP 函數連接到 Firebase 託管。您的 Firebase 託管站點上的請求可以代理到特定的 HTTP 函數。這還允許您將自己的自定義域與 HTTP 函數一起使用。詳細了解如何將 Cloud Functions 連接到 Firebase 託管