获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

通过 HTTP 请求调用函数

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以使用 functions.https 通过 HTTP 请求触发functions.https 。这允许您通过以下受支持的 HTTP 方法调用同步函数: GETPOSTPUTDELETEOPTIONS

此页面中的示例基于在您向函数端点发送 HTTP GET请求时触发的示例函数。示例函数检索当前服务器时间,按照 URL 查询参数中指定的格式设置时间格式,然后在 HTTP 响应中发送结果。

使用 HTTP 请求触发函数

使用functions.https创建一个处理 HTTP 事件的函数。 HTTP 函数的事件处理程序侦听onRequest()事件,该事件支持由Express Web 框架管理的路由器和应用程序。

使用 Express 请求和响应对象

用作onRequest()的参数时, Request对象使您可以访问客户端发送的 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 函数。否则,您的函数可能会继续运行并被系统强行终止。另请参阅同步、异步和承诺

使用 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 托管