通过 HTTP 请求调用函数

与第 1 代一样,您可以使用 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 请求时触发。该示例函数会检索当前的服务器时间,按网址查询参数中的要求格式化该时间,并在 HTTP 响应中发送结果。

使用 Express 请求和响应对象

Request 对象和 Response 对象可用作 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 函数后,您可以通过函数专属的网址来对其进行调用。部署后,请使用 CLI 输出的确切网址。

例如,用于调用 date() 的网址如下所示:

https://date-<random-hash>-<region>.a.run.app

对于 Express 应用路由,函数名称会作为前缀添加到您定义的应用中的网址路径。

从请求中读取值

date() 函数示例中,函数会同时测试网址参数和正文,以获取 format 值来设置要使用的日期/时间格式:

let format = req.query.format;
format = req.body.format;

终止 HTTP 函数

务必使用 send()redirect()end() 结束 HTTP 函数。否则,您的函数可能会继续运行,然后被系统强行终止。另请参阅同步、异步和 Promise

使用 Node.js moment 模块检索服务器时间并设置其格式后,date() 函数会在 HTTP 响应中发送结果并结束:

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 函数。详细了解如何将 Cloud Functions 关联到 Firebase Hosting