您的网络钩子目前在 cruisePlanCoverage
函数中使用硬编码数据。在本教程的这一步中,您将创建一个 Spanner 数据库,向其填充涵盖的目的地,并更新函数以查询该数据库。
项目配置
请务必确保您的 Dialogflow 代理和数据库位于同一项目中。 要让函数安全访问数据库,这是最简单的方法。此外,您还必须启用 Spanner API。
在创建数据库之前,请先从 Google Cloud 控制台中选择您的项目。
为项目启用 Spanner API。
创建 Spanner 实例
首次使用 Spanner 时,您必须创建一个实例,用于分配该实例中 Spanner 数据库所使用的资源。
在 Google Cloud 控制台中,前往 Spanner 实例页面。
点击创建实例。
输入 Tutorial Instance 作为实例名称。
系统会根据实例名称自动输入实例 ID。
在选择您的配置中,保留默认选项 Regional,并选择您在创建函数时选择的同一区域位置。
在分配计算容量中,输入 100 个处理单元。这为本教程提供了最小容量。
点击创建。Google Cloud 控制台会显示您创建的实例的概览页面。
创建 Spanner 数据库
现在您已经有了实例,需要创建一个数据库。 如需创建数据库,请执行以下操作:
- 在实例概览页面中,点击创建数据库。
- 输入 tutorial-database 作为数据库名称。
- 选择 Google 标准 SQL 数据库方言。
- 点击创建。Google Cloud 控制台会显示您创建的数据库的概览页面。
为数据库创建表
现在您已经有了数据库,接下来需要为数据库创建一个表。如需创建表,请执行以下操作:
- 在数据库概览页面的“表”部分中,点击创建表。
在编写 DDL 语句页面中,输入以下内容:
CREATE TABLE Destinations ( Destination STRING(1024), Covered BOOL, ) PRIMARY KEY(Destination);
点击提交。 Google Cloud 控制台会返回数据库概览页面,并显示正在进行架构更新。等待更新完成。
将数据插入表格中
现在您的数据库有了表,您需要向该表中添加数据。 要添加数据,请执行以下操作:
- 在数据库概览页面上的表列表中,点击“目标位置”表。Google Cloud 控制台会显示“目标表”表的架构页面。
- 在左侧导航菜单中,点击数据,以显示目标表的数据页面。
点击插入。 Google Cloud 控制台会显示“Destinations”表的查询页面,其中包含一个新的查询标签页,其中包含
INSERT
和SELECT
语句。用以下内容覆盖这些语句:INSERT INTO Destinations (Destination, Covered) VALUES('anguilla', TRUE), ('canada', TRUE), ('china', TRUE), ('italy', TRUE), ('mexico', TRUE), ('spain', FALSE);
点击运行。
在左侧导航菜单中,再次点击数据,以显示目标表的数据。确认该表包含所需的数据。
更新 Cloud Function 以查询数据库
webhook 代码中的 cruisePlanCoverage
函数会检查特定环境变量是否设置了用于连接到数据库的信息。如果未设置这些环境变量,则该函数会使用硬编码的目的地列表。
现在您已设置数据库,请更新 Cloud Functions 函数以设置所需的环境变量:
打开 Cloud Functions 概览页面。
点击 tutorial-Telecommunications-webhook 函数以转到其详情页面。
点击修改。
打开运行时、构建和连接设置部分。
选择运行时标签页。
在“运行时环境变量”部分中添加以下变量:
PROJECT_ID
:您的项目 IDSPANNER_INSTANCE_ID
:您的 Spanner 实例 ID(可能是tutorial-instance
)SPANNER_DATABASE_ID
:您的 Spanner 数据库 ID(可能是tutorial-database
)
点击下一步。
点击部署。
等待状态指示器显示函数已成功部署。
测试代理
您的代理现在已准备就绪,可以试用了。点击 Dialogflow 控制台中的测试代理 (Test Agent) 按钮以打开模拟器。 尝试与客服人员进行以下对话:
回合 | 你 | 代理 |
---|---|---|
1 | 您好 | 您好!我是虚拟电信客服,我可以帮助您解决结算和计划方面的问题、排查问题、添加旅行和游轮计划。您现在需要什么帮助? |
2 | 我想添加邮轮计划 | 让我看看您。您向我们提供的手机号码是多少? |
3 | 123-123-1234 | 您乘船多少天? |
4 | 7 | 选项 1 包含通话和文字消息。每天的费用为 $[XX]。如需了解详情,请点击以下链接:[网址]。选项 2 包括通话、短信和数据流量。每天的费用为 $[XX]。如需了解详情,请点击以下链接:[网址]。你想添加哪个游轮计划? |
5 | 选项 1 | 知道了。我已经把这个计划添加到你的帐号了。在乘船期间,您可能还需要提供陆上保险。您将在哪个端口停下来? |
6 | 意大利 | 您在那里停留了多少天? |
7 | 3 | 好消息!意大利的陆地是免费的。大功告成!您现在还需要其他方面的帮助吗? |
仔细查看代码会发现,意大利并不在涵盖的目的地的硬编码列表中。这意味着您的网络钩子已成功连接到数据库(其中包括意大利)。
问题排查
webhook 代码包含日志记录语句。如果您遇到问题,请尝试查看 Cloud Function 的日志。
如果您的函数未连接到数据库,并且您在日志中看到权限错误,则可能需要修复函数使用的默认服务帐号的角色。此服务帐号的格式为 PROJECT_ID@appspot.gserviceaccount.com
。您可以通过以下任一方式来解决此问题:
如果默认服务帐号显示在 IAM 主页上,请更改服务帐号的权限。Editor 角色将可以运行,但您可能需要在生产场景中具有更精细的角色。
如果默认服务帐号未显示在 IAM 主页上,请通过将该服务帐号添加为新主帐号来授予所需的角色。
或者,您也可以使用自己创建的服务帐号。
更多信息
如需详细了解上述步骤,请参阅:
- 搭配使用 Cloud Spanner 与 Cloud Functions
- 使用 Google Cloud 控制台创建和查询数据库
- Google 标准 SQL 数据定义语言
- Google 标准 SQL 数据操纵语言