您可以使用functions.https
透過HTTP請求觸發函數。這允許您透過以下受支援的 HTTP 方法呼叫同步函數: GET
、 POST
、 PUT
、 DELETE
和OPTIONS
。
本頁面中的範例是基於當您向函數端點傳送 HTTP GET
請求時觸發的範例函數。此範例函數會擷取目前伺服器時間,並依照 URL 查詢參數中指定的方式設定時間格式,然後在 HTTP 回應中傳送結果。
使用 HTTP 請求觸發函數
使用functions.https
建立處理HTTP 事件的函數。 HTTP 函數的事件處理程序會偵聽onRequest()
事件,支援由Express Web 框架管理的路由器和應用程式。
使用 Express 請求和回應對象
Request物件用作onRequest()
的參數,可讓您存取用戶端傳送的 HTTP 請求的屬性,而Response物件則為您提供將回應傳送回客戶端的方法。
exports.date = functions.https.onRequest((req, res) => { // ... });
使用現有的 Express 應用程式
使用App作為onRequest()
的參數,您可以將完整的 Express 應用程式傳遞給 HTTP 函數。樣板代碼可以移動到中間件,如下所示:
const express = require('express');
const cors = require('cors');
const app = express();
// Automatically allow cross-origin requests
app.use(cors({ origin: true }));
// 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 = functions.https.onRequest(app);
呼叫 HTTP 函數
部署 HTTP 函數後,您可以透過自己的唯一 URL 呼叫它。 URL 依序包含以下內容:
- 您部署函數的區域(或多個區域)。某些生產功能可能需要明確設定位置以最大限度地減少網路延遲。
- 您的 Firebase 專案 ID
-
cloudfunctions.net
- 你的函數的名稱
例如,呼叫date()
的 URL 如下所示:
https://us-central1-<project-id>.cloudfunctions.net/date
如果您在部署函數時遇到權限錯誤,請確保將適當的IAM 角色指派給執行部署命令的使用者。
使用 Express 應用程式路由,函數名稱將作為前綴添加到您定義的應用程式中的 URL 路徑中。例如,在上面 Express 應用程式範例中呼叫 getter 的 URL 如下所示:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
如果您在防火牆或 IP 過濾器後面呼叫 HTTP 功能,則可以尋找Google 用於提供 HTTP 功能的 IP 位址。
將中間件模組與 Cloud Functions 結合使用
如果您需要注入 cookie 支援或 CORS 等中間件依賴項,請在函數中呼叫它們。例如,要啟用 CORS 支持,請新增以下區塊:
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
從請求中讀取值
下表列出了一些常見場景:內容類型 | 請求正文 | 行為 |
---|---|---|
application/json | '{"name":"John"}' | request.body.name 等於 'John' |
application/octet-stream | '我的文字' | request.body 等於「6d792074657874」(請求的原始位元組;請參閱Node.js 緩衝區文件) |
text/plain | '我的文字' | request.body 等於“我的文字” |
application/x-www-form-urlencoded | '名字=約翰' | request.body.name 等於 'John' |
此解析由以下主體解析器完成:
假設您的函數是透過以下的請求呼叫:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
那麼發送的數據將在以下情況下具體化:
屬性/方法 | 價值 |
---|---|
req.method | “郵政” |
req.get('x-myheader') | “123” |
req.query.foo | “巴茲” |
req.body.text | “某物” |
req.rawBody | 請求的原始(未解析)位元組 |
在date()
函數範例中,函數會測試 URL 參數和正文中的format
值,以設定要使用的日期/時間格式:
let format = req.query.format; format = req.body.format;
終止 HTTP 函數
始終使用send()
、 redirect()
或end()
結束 HTTP 函數。否則,您的函數可能會繼續運作並被系統強制終止。另請參閱同步、非同步和 Promises 。
使用 Node.js moment
模組檢索並格式化伺服器時間後, date()
函數會在 HTTP 回應中傳送結果來結束:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
將 HTTP 函數連接到 Firebase 託管
您可以將 HTTP 函數連接到 Firebase 託管。 Firebase 託管網站上的請求可以代理到特定的 HTTP 函數。這也允許您將自己的自訂網域與 HTTP 函數一起使用。詳細了解如何將 Cloud Functions 連接到 Firebase Hosting 。