将 Cloud Functions 与 Firebase Hosting 配对以生成和提供您的动态内容或将 REST API 构建为微服务。
Cloud Functions for Firebase可让您自动运行后端代码以响应 HTTPS 请求。您的代码存储在 Google 的云中,并在托管环境中运行。无需管理和扩展您自己的服务器。
有关与 Firebase 托管集成的 Cloud Functions 的示例用例和示例,请访问我们的无服务器概述。
将云功能连接到 Firebase 托管
本部分提供了一个将函数连接到 Firebase 托管的演练示例。
请注意,要提高提供动态内容的性能,您可以选择调整缓存设置。
第 1 步:设置 Cloud Functions
确保您拥有最新版本的 Firebase CLI 并已初始化 Firebase 托管。
有关安装 CLI 和初始化托管的详细说明,请参阅托管入门指南。
确保您已设置 Cloud Functions:
如果您已经设置了 Cloud Functions,则可以继续执行第 2 步:创建和测试 HTTPS 函数。
如果您尚未设置 Cloud Functions:
通过从项目目录的根目录运行以下命令来初始化 Cloud Functions:
firebase init functions
出现提示时,选择 JavaScript(本演练示例使用 JS)。
检查您的本地项目目录中是否有一个
functions
目录(由您刚刚运行的 Firebase 命令创建)。此functions
目录是 Cloud Functions 代码所在的位置。
第 2 步:为您的托管站点创建和测试 HTTPS 功能
在您喜欢的编辑器中打开
/functions/index.js
。用以下代码替换文件的内容。
此代码创建一个 HTTPS 函数(名为
bigben
),它像时钟一样在一天中的每个小时使用BONG
回复 HTTPS 请求。const functions = require('firebase-functions'); exports.bigben = functions.https.onRequest((req, res) => { const hours = (new Date().getHours() % 12) + 1 // London is UTC + 1hr; res.status(200).send(`<!doctype html> <head> <title>Time</title> </head> <body> ${'BONG '.repeat(hours)} </body> </html>`); });
使用Firebase Local Emulator Suite在本地测试您的功能。
从本地项目目录的根目录运行以下命令:
firebase emulators:start
通过 CLI 返回的本地 URL 访问函数,例如:
。http://localhost:5001/ PROJECT_ID /us-central1/bigben
访问Cloud Functions 文档以了解有关 HTTPS 请求的更多信息。
下一步将向您介绍如何从 Firebase 托管 URL访问此 HTTPS 功能,以便它可以为您的 Firebase 托管网站生成动态内容。
第 3 步:将 HTTPS 请求定向到您的函数
使用重写规则,您可以将匹配特定模式的请求定向到单个目的地。以下步骤向您展示了如何引导所有来自托管站点上路径../bigben
的请求来执行bigben
功能。
打开您的
firebase.json
文件。在
hosting
部分下添加以下rewrite
配置:"hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/bigben", "function": "bigben", "region": "us-central1" // optional (see note below) } ] }
通过使用 Firebase 模拟器再次测试,确认您的重定向是否按预期工作。
从本地项目目录的根目录运行以下命令:
firebase emulators:start
访问 CLI 返回的站点的本地托管 URL(通常是
localhost:5000
),但在 URL 后附加bigben
,如下所示:http://localhost:5000/bigben
迭代您的功能及其网站的功能。使用 Firebase 模拟器来测试这些迭代。
有关重写规则的更多详细信息,请访问托管配置页面。您还可以了解各种托管配置的响应优先顺序。
请注意,要提高提供动态内容的性能,您可以选择调整缓存设置。
第 4 步:部署您的函数
一旦您的函数在模拟器中按预期运行,您就可以使用真实的项目资源继续部署、测试和运行它。现在是考虑设置运行时选项以控制在生产中运行的函数的缩放行为的好时机。
通过从本地项目目录的根目录运行以下命令,将函数以及托管内容和配置部署到站点:
firebase deploy --only functions,hosting
通过以下 URL 访问您的实时站点和函数:
您的 Firebase 子域:
PROJECT_ID .web.app/bigben
和PROJECT_ID .firebaseapp.com/bigben
任何连接的自定义域:
CUSTOM_DOMAIN /bigben
使用网络框架
您可以在 Cloud Functions 中使用Express.js等 Web 框架来提供应用程序的动态内容并更轻松地编写复杂的 Web 应用程序。
以下部分提供了将 Express.js 与 Firebase 托管和 Cloud Functions 结合使用的演练示例。
通过从
functions
目录运行以下命令,在本地项目中安装 Express.js:npm install express --save
打开
/functions/index.js
文件,然后导入并初始化 Express.js:const functions = require('firebase-functions'); const express = require('express'); const app = express();
添加以下两个端点:
添加第一个端点以在
/
处为我们网站的索引提供服务。app.get('/', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.send(` <!doctype html> <head> <title>Time</title> <link rel="stylesheet" href="/style.css"> <script src="/script.js"></script> </head> <body> <p>In London, the clock strikes: <span id="bongs">${'BONG '.repeat(hours)}</span></p> <button onClick="refresh(this)">Refresh</button> </body> </html>`); });
另一个端点以 JSON 格式在
/api
下将BONG
计数作为 API 返回:app.get('/api', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.json({bongs: 'BONG '.repeat(hours)}); });
将 Express.js 应用导出为 HTTPS 函数:
exports.app = functions.https.onRequest(app);
在您的
firebase.json
文件中,将所有请求定向到app
函数。这种重写允许 Express.js 服务于我们配置的不同子路径(在这个例子中,/
和/api
)。{ "hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "**", "function": "app" } ] } }
添加中间件
继续我们的示例,现在您正在使用 Express.js,您可以以典型方式添加Express.js 中间件。例如,您可以在我们的端点上启用CORS请求。
通过运行以下命令安装
cors
中间件:npm install --save cors
打开
/functions/index.js
文件,然后将cors
添加到 Express.js 应用程序,如下所示:const cors = require('cors')({origin: true}); app.use(cors);
访问Cloud Functions 文档,了解有关将 Firebase 与 Express 应用程序和中间件模块结合使用的更多信息。
下一步
在全球 CDN 上为您的动态内容设置缓存。
使用Firebase Admin SDK与其他 Firebase 服务交互。