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

配置解析程序

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

创建您的第一个解析程序

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

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

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

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

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

注意:您刚刚创建的默认解析程序是一个单元解析程序,但 AppSync 还支持创建管道解析程序以对序列中的多个数据源运行操作。有关更多信息,请参阅管道解析程序

添加更改的解析程序

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

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

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

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

$utils.toJson($context.result)

AWS AppSync 还支持测试和调试编辑解析程序所用的工作流。您可在调用之前使用模拟 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 使用其他操作。而且,可以从其他数据源提取数据,例如 AWS Lambda 或 Amazon Elasticsearch Service,因为关系是由 GraphQL 架构控制的。

在控制台的 Schema (架构) 页面上,选择 Todo type (Todo 类型)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)