配置解析程序 - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

配置解析程序

在此部分中,您将演练如何创建解析程序、为更改添加解析程序以及使用高级配置。

创建您的第一个解析程序

在AmazonAppSync 控制台,转到架构页. 在右侧的 Query (查询) 类型中,选择 Attach resolver (附加解析程序)getTodos 字段旁)。在 Create Resolver (创建解析程序) 页面上,选择您刚创建的数据源,然后选择一个默认模板或粘贴到您自己的模板中。对于常见的使用案例,AmazonAppSync 控制台中的内置模板可使用它们从数据源中获取项目(例如,所有项目查询、单个查询等)。例如,对于设计您的架构中介绍的简易版本架构,getTodos 没有分页,映射模板如下:

{ "version" : "2017-02-28", "operation" : "Scan" }

您始终需要响应映射模板。控制台为列表提供的默认模板具有以下传递值:

$util.toJson($context.result.items)

此示例中,项目列表的 context 对象(别名为 $ctx)的格式为 $context.result.items。如果你的 GraphQL 操作返回一个项目,那将是$context.result.Amazon AppSync 为常见操作提供帮助函数,例如$util.toJson之前列出的函数,以便正确格式化响应。有关函数的完整列表,请参阅解析程序映射模板实用程序参考

注意:你刚创建的默认解析器是单位但 AppSync 也支持创建管道解析器可以按顺序对多个数据源运行操作。有关更多信息,请参阅管道解析程序

添加更改的解析程序

重复上述过程,从架构页面然后选择附加解析程序(对于 )addTodo更改。由于我们要通过这个更改将新项目添加到 DynamoDB,请使用以下请求映射模板:

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

AmazonAppSync 会自动转换中定义的参数addTodo字段将 GraphQL 架构转入 DynamoDB 操作。上一示例使用键将记录存储在 DynamoDB 中。id,它是从更改论点传递而来的$ctx.args.id. 您传递的所有其他字段将使用自动映射到 DynamoDB 属性$util.dynamodb.toMapValuesJson($ctx.args).

对于此解析程序,使用以下响应映射模板:

$utils.toJson($context.result)

AmazonAppSync 还支持测试和调试编辑解析程序所用的工作流。您可在调用之前使用模拟 context 对象查看模板经过转换的值。还可在运行查询时选择以交互方式查看对数据源的完整请求执行过程。有关更多信息,请参阅测试并调试解析程序以及监控和日志记录

此时,如果您没有使用高级解析程序,可以如使用 API 中所述开始使用您的 GraphQL API。

高级解析程序

如果您学习了设计您的架构中介绍的“高级”部分,而且要构建一个示例架构,请为 getTodos 字段使用以下请求模板:

{ "version" : "2017-02-28", "operation" : "Scan", "limit": $util.defaultIfNull(${ctx.args.limit}, 20), "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null)) }

对于这个分页使用案例,响应映射不只是简单的传递,因为它必须包含光标(这样客户端才知道下次从哪一页开始)以及结果集。映射模板如下所示:

{ "todos": $util.toJson($context.result.items), "nextToken": $util.toJson($context.result.nextToken) }

以上响应映射模板中的字段必须与 TodoConnection 类型中定义的字段匹配。

对于关系而言,您有 Comments 表,要解析 Todo 类型的评论字段(返回 [Comment] 类型),您可使用映射模板针对第二个表运行查询。为此,您必须已经如附加数据源中所述为 Comments 表创建了一个数据源。

注意:我们针对第二个表使用查询操作仅作说明用途。您可以针对 DynamoDB 使用其他操作。而且,您可以从其他数据源提取数据,例如Amazon Lambda或者亚马逊 OpenSearch 服务,因为关系是由 GraphQL 架构控制的。

在存储库的架构在控制台中选择页面,选择comments字段中TODO 类型,然后选择Attach. 选择 Comments table data source (Comments 表数据源),然后使用以下请求映射模板:

{ "version": "2017-02-28", "operation": "Query", "index": "todoid-index", "query": { "expression": "todoid = :todoid", "expressionValues": { ":todoid": { "S": $util.toJson($context.source.id) } } } }

context.source 会引用当前被解析的字段的父对象。在本示例中,source.id 指单个 Todo 对象,之后它会被用于查询表达式。

您可以如下所示使用传递响应映射模板:

$util.toJson($ctx.result.items)

最后,在控制台的 Schema (架构) 页面上,将解析程序附加到 addComment 字段,并为 Comments 表指定数据源。在此例中请求映射模板只是简单的 PutItem,它具有作为参数注释的特定 todoid,但您可以使用 $utils.autoId() 实用程序来为如下所示注释创建唯一的排序键:

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

如下所示使用传递响应模板:

$util.toJson($ctx.result)