與第一代一樣,您可以使用onRequest()
處理程序通過 HTTP 請求觸發函數。這允許您通過以下受支持的 HTTP 方法調用函數: GET
、 POST
、 PUT
、 DELETE
和OPTIONS
。
額外的 HTTP 選項
選項 | 描述 |
---|---|
region | HTTP 函數可以指定區域數組以及單個區域。當指定多個區域時,將為每個區域部署一個單獨的功能實例。 |
timeoutSeconds | HTTP 函數可以指定最多一小時的超時。 |
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 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 託管。