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

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

配置解析程序

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

创建您的第一个解析程序

在Amazon在 AppSync 控制台中,转至架构页. 在右侧的 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 表创建了一个数据源。

注意:我们仅为了演示,才针对第二个表使用查询操作。您可以针对使用其他操作。而且,可以从其他数据源提取数据,例如 Amazon Lambda 或 Amazon OpenSearch Service,因为关系是由 GraphQL 架构控制的。

在存储库的架构在控制台中的页面上,选择comments在字段中待办事项类型,然后选择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)