您可以使用 functions.https 通过 HTTP 请求触发functions.https
。这允许您通过以下受支持的 HTTP 方法调用同步函数: GET
、 POST
、 PUT
、 DELETE
和OPTIONS
。
此页面中的示例基于在您向函数端点发送 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 托管。