本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
测试和调试解析器 (VTL)
Amazon AppSync 针对数据源在 GraphQL 字段上执行解析器。如解析器映射模板概述中所述,解析器使用模板语言与数据源通信。从而支持您自定义行为,并在与数据源通信前后应用逻辑和条件。有关编写解析器的入门教程式编程指南,请参阅 R esolver 映射模板编程指南。
为了帮助开发人员编写、测试并调试这些解析程序,Amazon AppSync 控制台还提供工具,针对每个字段的解析程序使用模拟数据创建 GraphQL 请求和响应。此外,您可以在Amazon AppSync 控制台中执行查询、变更和订阅,并查看来自亚马逊 CloudWatch 的整个请求的详细日志流。其中包括从数据源获得的结果。
使用模拟数据进行测试
在调用 GraphQL 解析程序时,它包含的 context
对象具有您所编程的请求的相关信息。其中包括来自客户端的参数、身份信息以及 GraphQL 父字段的数据。它还包括来自数据源、可在响应模板中使用的结果。有关此结构的更多信息以及在编程时可用的帮助程序实用程序,请参阅解析程序映射模板上下文参考。
在编写或编辑解析器时,可以将模拟或测试context
对象传递到控制台编辑器中。这使您能够查看请求和响应模板如何评估,而不必针对数据源实际运行。例如,您可以传递测试 firstname: Shaggy
参数,观察在您的模板代码中使用 $ctx.args.firstname
时如何评估。您还可以测试任何实用程序帮助程序(例如 $util.autoId()
或 util.time.nowISO8601()
)的评估。
测试解析器
此示例将使用Amazon AppSync 控制台测试解析器。
-
登录 Amazon Web Services Management Console并打开 AppSync 控制台
。 -
在 API 控制面板中,选择你的 GraphQL API。
-
在边栏中,选择架构。
-
-
如果您还没有这样做,请在类型下方和字段旁边选择 “附加” 以添加您的解决者。
有关如何构建完整解析器的更多信息,请参阅配置解析器。
否则,请选择字段中已有的解析器。
-
在 “编辑解析器” 页面的顶部,选择 “选择测试上下文”,选择 “创建新上下文”。
-
在下面的执行上下文窗口中选择示例上下文对象或手动填充 JSON。
-
输入文本上下文名称。
-
选择保存按钮。
-
在 “编辑解析器” 页面的顶部,选择 “运行测试”。
举一个更实际的例子,假设您有一个存储了 GraphQL 类型的应用程序Dog
,该应用程序使用自动生成对象的 ID 并将其存储在 Amazon DynamoDB 中。您还希望写入 GraphQL 更改参数的一些值,而且仅允许特定用户看到响应。下面显示了架构的外观:
type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }
当你为addDog
突变添加解析器时,你可以填充一个上下文对象,如下例所示。以下代码拥有 name
和 age
客户端的参数,以及 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
之外的值,将不会返回结果,因为授权检查将失败。有关细粒度访问控制的更多信息,请参阅授权用例。
使用Amazon AppSync的 API 测试映射模板
您可以使用EvaluateMappingTemplate
API 命令使用模拟数据远程测试映射模板。要开始使用该命令,请确保您已将权appsync:evaluateMappingTemplate
限添加到策略中。例如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateMappingTemplate", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }
您可以使用Amazon CLIDog
架构及其请求/响应映射模板为例。使用本地工作站上的 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
。您也可以使用Amazon SDK 测试您的模板。以下是使用适用于 JavaScript V2 的 SAmazon DK 的示例:
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 Testing FrameworkJSON.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
调试实时查询
调试生产应用程序的 end-to-end 测试和日志记录是无可替代的。Amazon AppSync 允许您使用亚马逊记录错误和完整的请求详情 CloudWatch。此外,您可以使用 Amazon AppSync 控制台测试 GraphQL 查询、更改和订阅,以及返回查询编辑器的每个请求的实时流日志数据,以便进行实时调试。对于订阅而言,日志显示连接时间信息。
要执行此操作,您需要提前启用 Amazon CloudWatch 日志,如监控和日志中所述。接下来,在 Amazon AppSync 控制台中,选择 Queries (查询) 选项卡,然后输入有效的 GraphQL 查询。在右下角部分,单击并拖动 “日志” 窗口以打开日志视图。在页面顶部,选择“播放”箭头图标运行您的 GraphQL 查询。片刻之后,此操作的完整请求和响应日志将流式传输到控制台的这一部分,之后您可以在控制台中进行查看。