测试和调试解析器 (VTL) - AWS AppSync

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

测试和调试解析器 (VTL)

注意

我们现在主要支持 APPSYNC_JS 运行时环境及其文档。请考虑使用 APPSYNC_JS 运行时环境和此处的指南。

AWS AppSync 对数据源执行 GraphQL 字段上的解析器。正如解析器映射模板概述中所述,解析器使用模板语言与数据源进行通信。这样,您就可以在与数据源通信之前和之后自定义行为并应用逻辑和条件。有关编写解析器的入门教程风格的编程指南,请参阅解析器映射模板编程指南

为了帮助开发人员编写、测试和调试这些解析器,AWS AppSync 控制台还提供了一些工具,以针对单个字段解析器使用模拟数据创建 GraphQL 请求和响应。此外,您可以在 AWS AppSync 控制台中执行查询、变更和订阅,并从 Amazon CloudWatch 中查看整个请求的详细日志流。其中包括从数据源获得的结果。

使用模拟数据进行测试

在调用 GraphQL 解析器时,它包含一个 context 对象,其中包含有关请求的信息。其中包括来自客户端的参数、身份信息以及 GraphQL 父字段的数据。它还包含来自数据源的结果,可以在响应模板中使用这些结果。有关此结构的更多信息以及在编程时可用的帮助程序实用程序,请参阅解析器映射模板上下文参考

在编写或编辑解析器时,您可以将模拟测试上下文 对象传递到控制台编辑器中。这使您能够查看请求和响应模板如何评估,而不必针对数据源实际运行。例如,您可以传递测试 firstname: Shaggy 参数,观察在您的模板代码中使用 $ctx.args.firstname 时如何评估。您还可以测试任何实用程序帮助程序(例如 $util.autoId()util.time.nowISO8601())的评估。

测试解析器

该示例将使用 AWS AppSync 控制台测试解析器。

  1. 登录到 AWS Management Console,然后打开 AppSync 控制台

    1. API 控制面板中,选择您的 GraphQL API。

    2. 侧边栏中,选择架构

  2. 如果您尚未在类型下面的字段旁边选择附加以添加解析器,请执行该操作。

    有关如何构建完整解析器的更多信息,请参阅配置解析器

    否则,选择已位于字段中的解析器。

  3. 编辑解析器页面顶部,选择选择测试上下文,然后选择创建新上下文

  4. 选择一个示例上下文对象,或者在下面的执行上下文窗口中手动填充 JSON。

  5. 输入测试上下文名称

  6. 选择保存按钮。

  7. 编辑解析器页面顶部,选择运行测试

举一个更实际的例子,假设您具有一个存储 GraphQL 类型 Dog 的应用程序,该应用程序自动为对象生成 ID 并将其存储在 Amazon DynamoDB 中。您还希望通过 GraphQL 变更参数写入一些值,并仅允许特定用户查看响应。下面显示了架构的外观:

type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }

在您为 addDog 变更添加解析器时,您可以填充上下文对象,如以下示例中所示。以下代码拥有 nameage 客户端的参数,以及 identity 对象中填充的 username

{ "arguments" : { "firstname": "Shaggy", "age": 4 }, "source" : {}, "result" : { "breed" : "Miniature Schnauzer", "color" : "black_grey" }, "identity": { "sub" : "uuid", "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}", "username" : "Nadia", "claims" : { }, "sourceIp" :[ "x.x.x.x" ], "defaultAuthStrategy" : "ALLOW" } }

您可以使用以下请求和响应映射模板测试此内容:

请求模板

{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : { "S" : "$util.autoId()" } }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) }

响应模板

#if ($context.identity.username == "Nadia") $util.toJson($ctx.result) #else $util.unauthorized() #end

经过评估的模板拥有您的测试上下文对象的数据,以及 $util.autoId() 生成的值。此外,如果您要将 username 更改为除 Nadia 之外的值,将不会返回结果,因为授权检查将失败。有关精细访问控制的更多信息,请参阅授权使用案例

使用 AWS AppSync 的 API 测试映射模板

您可以通过 EvaluateMappingTemplate API 命令使用模拟数据远程测试您的映射模板。要开始使用该命令,请确保您已将 appsync:evaluateMappingTemplate 权限添加到您的策略中。例如:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateMappingTemplate", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }

您可以通过 AWS CLIAWS SDK 使用该命令。例如,采用上一节中的 Dog 架构及其请求/响应映射模板。通过在本地工作站上使用 CLI,将请求模板保存到名为 request.vtl 的文件中,然后将 context 对象保存到名为 context.json 的文件中。从 Shell 中,运行以下命令:

aws appsync evaluate-mapping-template --template file://request.vtl --context file://context.json

该命令返回以下响应:

{ "evaluationResult": "{\n \"version\" : \"2017-02-28\",\n \"operation\" : \"PutItem\",\n \"key\" : {\n \"id\" : { \"S\" : \"afcb4c85-49f8-40de-8f2b-248949176456\" }\n },\n \"attributeValues\" : {\"firstname\":{\"S\":\"Shaggy\"},\"age\":{\"N\":4}}\n}\n" }

evaluationResult 包含使用提供的 context 测试您提供的模板的结果。您也可以使用 AWS SDK 测试您的模板。以下是使用 AWS SDK for JavaScript V2 的示例:

const AWS = require('aws-sdk') const client = new AWS.AppSync({ region: 'us-east-2' }) const template = fs.readFileSync('./request.vtl', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') client .evaluateMappingTemplate({ template, context }) .promise() .then((data) => console.log(data))

通过使用 SDK,您可以轻松合并常用的测试套件中的测试以验证模板行为。我们建议使用 Jest 测试框架创建测试,但任何测试套件都有效。以下代码片段显示假设的验证运行。请注意,我们希望评估响应是有效的 JSON ,因此,我们使用 JSON.parse 从字符串响应中检索 JSON:

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) test('request correctly calls DynamoDB', async () => { const template = fs.readFileSync('./request.vtl', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateMappingTemplate({ template, context }).promise() const result = JSON.parse(response.evaluationResult) expect(result.key.id.S).toBeDefined() expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname) })

这会产生以下结果:

Ran all test suites. > jest PASS ./index.test.js ✓ request correctly calls DynamoDB (543 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 1.511 s, estimated 2 s

调试实时查询

在调试生产应用程序时,进行端到端测试和日志记录是无可替代的。AWSAppSync 允许您使用 Amazon CloudWatch 记录错误和完整请求详细信息。此外,您可以使用 AWS AppSync 控制台测试 GraphQL 查询、变更和订阅,并将每个请求的日志数据实时流式传输到查询编辑器以进行实时调试。对于订阅而言,日志显示连接时间信息。

要执行该操作,您需要提前启用 Amazon CloudWatch Logs,如监控和日志记录中所述。接下来,在 AWS AppSync 控制台中,选择查询选项卡,然后输入有效的 GraphQL 查询。在右下部分中,单击并拖动日志窗口以打开“日志”视图。在页面顶部,选择“播放”箭头图标运行您的 GraphQL 查询。片刻之后,此操作的完整请求和响应日志将流式传输到控制台的这一部分,之后您可以在控制台中进行查看。