使用 Visual Studio Code 通过 Cloud Functions for Node.js 进行本地开发

1. 概览

Google Cloud Functions 是一个事件驱动型无服务器计算平台。借助 Cloud Functions,您可以编写代码,而不必担心预配资源或扩缩以应对不断变化的需求。

以 JavaScript 编写的 Cloud Functions 函数在 Google Cloud Platform 上的 Node.js 环境中执行。您可以在任何标准 Node.js 运行时中运行 Cloud Functions 函数,以实现可移植性和本地测试。

演示

在此 Codelab 中,您将为 Node.js 创建一个 Cloud Functions 函数,用于报告指定温度是否可接受或过高。您将在本地机器上使用 Visual Studio Code 创建、测试和调试 Cloud Functions 函数。最后,您会将函数部署到 Google Cloud Platform。

学习内容

  • Node.js 版 Cloud Functions 框架。
  • 在本地创建和测试 HTTP Cloud Functions 函数。
  • 在本地机器上调试 HTTP 函数。
  • 在本地机器上部署 HTTP 函数。

2. 设置和要求

前提条件

费用

虽然此 Codelab 仅需要调用一次已部署的 Cloud Functions 函数,但您仍应参阅 Cloud Functions API 价格信息,以了解结算方式。

虽然许多 Google API 可以免费使用,但使用 Google Cloud Platform(即其产品和 API)并非免费。您需要一个有效的结算账号才能使用 Cloud Functions。请注意,某些 Google Cloud Platform (GCP) 产品具有 “永久免费”层级,您必须超出该层级才能产生费用。就此 Codelab 而言,每次调用 Cloud Functions 函数都计入该免费层级。只要您在每个月内保持在总限制范围内,就不会产生任何费用。

3. 安装 Node.js 版 Cloud Functions 框架

Node.js 版 Cloud Functions 框架是由 Google Cloud Functions 团队推出的开源 FaaS(函数即服务)框架,用于编写可移植的 Node.js 函数。

借助 Cloud Functions 框架,您可以编写在许多不同环境中运行的轻量级函数,这些环境包括:

  • Google Cloud Functions
  • 您的本地开发机器
  • Cloud Run 和 Cloud Run on GKE
  • 基于 Knative 的环境

创建一个新的 node.js 应用。

npm init

在接受默认值时,请务必使用 index.js 作为应用的入口点。

现在安装 Node.js 版 Cloud Functions 框架。

npm install @google-cloud/functions-framework

打开 package.json。验证您是否看到 Cloud Functions 框架列为依赖项,如以下示例所示。

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

Cloud Functions 框架现已成功安装。现在,您可以创建 Cloud Functions 函数了。

4. 在本地创建和测试 HTTP Cloud Functions 函数

创建本地 Cloud Functions 函数

在本部分中,您将创建一个 HTTP 函数并对其进行测试,该函数可响应 HTTP 请求。

在与 package.json 文件相同的目录下创建一个名为 index.js 的新文件。

添加以下内容:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

现在,您可以测试该函数了。

在 Visual Studio Code 中测试函数

从现在开始,此 Codelab 将使用 Visual Studio Code 中的 集成式终端

在 Visual Studio Code 中,打开一个终端窗口。

运行以下命令:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

此命令会启动一个本地服务器,该服务器在收到 HTTP 请求时即可调用 validateTemperature 函数。

您应该会在终端窗口中看到以下输出:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

在 VS Code 中,点击“终端”窗口窗格中的 New Terminal 加号图标,创建第二个终端窗口。您将在这两个终端窗口之间切换:第一个用于提供函数,第二个用于使用 curl 调用函数。

bceb65f366d837ae.png

您可以使用下拉列表在终端窗口之间切换。如果某个终端窗口当前正在提供函数,则下拉列表会将其称为 node。否则,它会被称为 zsh(或您使用的 shell)。

在第二个终端窗口中,运行以下命令,将温度载荷 50 发送到提供 validateTemperature 函数的本地服务器。

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

您应该会收到来自 Cloud Functions 函数的以下响应:

Temperature OK

在第二个终端窗口中,再次测试该函数,方法是发送“过高”温度负载,如下所示:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

您应该会收到来自 Cloud Functions 函数的以下响应:

Too hot

最后,通过使用缺失的负载调用该函数来测试该函数。

curl -X POST http://localhost:8080

您应该会收到来自 Cloud Functions 函数的以下响应:

Too hot

理想情况下,如果未提供温度,该函数不应返回“过高”。您已发现代码中存在 bug。

请务必在提供函数的第一个终端窗口中按 Ctrl + C,以停止运行函数。

5. 在本地机器上调试 HTTP 函数

在 Visual Studio Code 中打开命令面板。如果您使用的是 Mac,请使用 Cmd + Shift + P。如果您使用的是 Windows,请使用 Ctrl + Shift + P.

在命令面板中输入 auto attach,然后选择列表中的第一个项。

601e542b4ec9f6f9.png

对于此 Codelab,请选择 Only With Flag,如下图所示:

b9e6b762d150e62b.png

现在,将鼠标悬停在最右侧显示的警告图标上,重新加载您在 VS Code 中用于部署函数的终端窗口。

点击 Relaunch Terminal

37b61e3fb546fc76.png

在重新加载的终端窗口中,重新运行 Functions 框架,以使用以下命令提供函数:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

其中,--inspect 标志会告知 Node.js 监听调试客户端。如需了解详情,请参阅 Node 调试文档

请注意,您使用的是 node_modules/.bin/functions-framework,而不是 node_modules/@google-cloud/functions-framework。您需要在 /node_modules/.bin 中使用自动 符号链接的可执行文件,才能使用检查模式。

这次,您应该会在 VS Code 中看到一个橙色状态栏,表明调试器已附加。

点击行号左侧的边距,在第 3 行设置断点。

2fbb4d5916e1dbfa.png

断点图标应亮起鲜红色,表明调试器可以访问此代码行。

846e6c5993cc87f9.png

在第二个终端窗口中,运行以下 curl 命令来命中该断点。

curl -X POST http://localhost:8080 

您会看到第 3 行上显示黄色突出显示。此突出显示表明此行是调试器当前正在评估的语句。

206c7ed1eb189e90.png

将鼠标悬停在 temp 变量上,以验证其内容是否为 undefined,因为请求未提供温度负载。

97979025f4bf2842.png

点击单步跳过图标以执行下一条语句。

您会看到当前语句跳转到 if 语句的 else 部分。

cf0e8ce7e0388f98.png

对于此演示,您可以假定规范要求所有请求都发送温度读数。万一未提供温度读数,该函数应抛出异常。

点击“断开连接”按钮以断开调试器的连接。

1070d059775ad769.png

在第一个终端窗口中,按 Ctrl + C 停止运行函数。

更新函数以添加 if 语句,以便在温度未定义时抛出异常,如下所示:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

在第一个终端窗口中,再次运行 Cloud Functions 函数,方法是运行以下命令(不带 –inspect 标志) ,以避免附加调试器。

node node_modules/@google-cloud/functions-framework --target=validateTemperature

在第二个终端窗口中运行以下命令,验证是否抛出了异常:

curl -X POST http://localhost:8080 

您应该会看到请求返回的以下输出:

Temperature is undefined

在第一个终端窗口中,您还会看到函数记录的错误。

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

现在,您可以在第一个终端窗口中按 Ctrl + C,停止运行函数。

6. 在本地机器上将 HTTP 函数部署到 Google Cloud

现在,您已在本地机器上创建、测试和调试 Cloud Functions 函数,可以将其部署到 Google Cloud 了。

运行以下命令,验证您是否在本地使用第 2 步中创建的项目:

gcloud config get-value project

如果您在第 2 步中指定的项目不是有效配置,请运行以下命令:

gcloud config set project <project-name-created-step-2>

在任何终端窗口中,运行以下命令:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

其中,参数说明如下:

  • deploy validateTemperature - 用于部署 Cloud Functions 函数的 gcloud 子命令,该函数名为 validateTemperature,入口点名为 validateTemperature
  • --trigger-http - 触发事件类型
  • --runtime nodejs12 - 此函数的目标运行时
  • --allow-unauthenticated - 允许公开访问以调用该函数

系统会提示您启用 Cloud Functions API。输入 y 以启用 API。

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

部署完成后,您会在输出中看到以下内容:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

在终端窗口中,使用 curl 调用此公共端点。

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

并通过验证适当的响应来确认 Cloud Functions 函数已成功部署。

Temperature OK

7. 清理

为避免意外产生费用(例如,此 Cloud Functions 函数意外调用次数超过 免费层级中每月 Cloud Functions 函数调用配额),您可以删除 Cloud Functions 函数或删除您在第 2 步中创建的项目。

如需删除 Cloud Functions 函数,请前往 Cloud Functions Cloud 控制台:https://console.cloud.google.com/functions/。确保您在第 2 步中创建的项目是当前所选项目。

选择您在第 6 步中部署的 validateTemperature 函数。然后点击“删除”。

4dada486485a935a.png

如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果您删除了项目,则需要在 Cloud SDK 中更改项目。您可以通过运行 gcloud projects list 查看所有可用项目的列表。

8. 恭喜!

恭喜您完成此 Codelab。您可以详细了解 Cloud Functions 如何支持 Node.js 运行时,以及 本地调试如何与 Cloud Functions 协同工作

所学内容

  • Node.js 版 Cloud Functions 框架。
  • 在本地创建和测试 HTTP Cloud Functions 函数。
  • 在本地机器上调试 HTTP 函数。
  • 在本地机器上部署 HTTP 函数。