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

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

配置解析器 (JavaScript)

GraphQL 解析程序将类型的架构中的字段连接到数据源。解析器是满足请求的机制。

Amazon AppSync 用于将 GraphQL 表达式 JavaScript 转换为数据源可以使用的格式的解析器。或者,可以用 Apache Velocity 模板语言 (VTL) 编写映射模板,将 GraphQL 表达式转换为数据源可以使用的格式。

本节介绍如何使用解析器 JavaScript。Resolver 教程 (JavaScript) 提供了有关如何使用实现解析器的深入教程 JavaScript。R esolver 参考资料 (JavaScript) 解释了可用于解 JavaScript 析器的实用程序操作。

我们建议您在尝试使用上述任何教程之前先阅读本指南。

在本节中,我们将介绍如何创建解析器、为突变添加解析器以及使用高级配置。

创建您的第一个解析器

按照前面部分的示例,第一步是为您的Query类型创建解析器。

Console
  1. 登录 Amazon Web Services Management Console并打开 AppSync 控制台

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

    2. 侧栏中,选择架构

  2. 有一个名为 “解析器” 的窗口。此框包含在 “架构” 窗口中定义的类型和字段列表。你可以将解析器附加到字段。例如,在 “查询类型” 下,选择getTodos字段旁边的 “附加”。

  3. 在 “创建解析器” 页面上,选择 “创建函数”。

  4. 选择数据源,然后命名您的函数SCAN_TODOS,然后更新函数代码:

    import { util } from '@aws-appsync/utils'; /** * Performs a scan on the dynamodb data source */ export function request(ctx) { return { operation: 'Scan' }; } /** * return a list of scanned todo items */ export function response(ctx) { return ctx.result.items; }
  5. 选择 Create(创建)

  6. 返回解析器屏幕,选择 “添加函数” 下拉列表,然后将您的函数添加到函数列表中。

  7. 选择 “创建” 以创建解析器。

在此示例中,您编写了一个实现请求和响应处理程序的Amazon AppSync函数。该函数负责与您的数据源进行交互。请求处理程序将Scan操作发送到Amazon AppSync,指示其对您的 DynamoDB 数据源执行什么操作。响应处理程序返回项目列表 (ctx.result.items)。然后,项目列表将自动映射到Todo GraphQL 类型。

为突变添加解析器

下一步是为您的Mutation类型创建解析器。

Console
  1. 登录 Amazon Web Services Management Console并打开 AppSync 控制台

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

    2. 侧栏中,选择架构

  2. 在 “突变类型” 下,选择addTodo字段旁边的 “附加”。

  3. 选择 “添加函数”,然后选择 “创建新函数”。

  4. 使用以下代码创建名为的新函数CREATE_TODO,该函数向 DynamoDB 添加项目:

    import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { const { id, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id }), attributeValues: util.dynamodb.toMapValues(values), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
  5. 创建函数后,返回解析器屏幕,将其添加到函数列表中。选择 “创建” 以创建解析器。

Amazon AppSync自动将addTodo字段中定义的参数从 GraphQL 架构转换为 DynamoDB 操作。前面的示例使用的密钥将记录存储在 DynamoDB 中id,该密钥从突变参数传递为ctx.args.id。您传递的所有其他字段都会自动映射到 DynamoDB 属性util.dynamodb.toMapValues(values)

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

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

高级解析器

如果您正在关注 “高级” 部分,并且要在 “设计架构” 中构建示例架构以进行分页扫描,则可以使用以下代码更新该SCAN_TODOS函数:

/** * Performs a scan on the dynamodb data source */ export function request(ctx) { const { limit = 20, nextToken } = ctx.args; return { operation: 'Scan', limit, nextToken }; } /** * @returns the result of the `put` operation */ export function response(ctx) { const { items: todos = [], nextToken } = ctx.result; return { todos, nextToken }; }

对于这个分页用例,函数响应处理程序不仅仅是一个直通函数,因为它必须同时包含游标(以便客户端知道接下来要从哪个页面开始)和结果集(theitems)。

响应评估结果中的字段应与您的TodoConnection类型中定义的字段相匹配。

对于关系来说,你有一个Comments表并且你正在解析该Todo类型的注释字段(它返回一种类型[Comment]),你可以创建一个解析器,从另一个数据源检索关联的注释。为此,您必须已经为Comments表创建了数据源,如附加数据源中所述。

注意

我们对第二张表使用查询操作仅用于说明目的。你可以改用另一个针对 DynamoDB 的操作。此外,您可以从其他数据源(例如Amazon Lambda或 Amazon Serv OpenSearch ice)提取数据,因为该关系由您的 GraphQL 架构控制。

Console
  1. 登录 Amazon Web Services Management Console并打开 AppSync 控制台

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

    2. 侧栏中,选择架构

  2. 在 “待办事项类型” 下,选择comments字段旁边的 “附加”。

  3. 在 “添加函数” 下,选择创建新函数并创建名为的新函数TODO_COMMENTS

    1. 选择您的Comment DynamoDB 数据源并提供以下代码:

      import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id } = ctx.source; return { operation: 'Query', index: 'todoid-index', query: { expression: 'todoid = :todoid', expressionValues: util.dynamodb.toMapValues({ ':todoid': id }), }, }; } export function response(ctx) { return ctx.result.items; }
    2. 保存您的函数,然后将该函数添加到您的解析器中。

  4. 选择 create 来创建解析器。

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

    在控制台的 “架构” 页面上,将解析器附加到该addComment字段。

    1. 使用以下代码创建一个名CREATE_COMMENT为的新函数:

      import { util } from '@aws-appsync/utils'; export function request(ctx) { const { todoid, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ todoid, commentid: util.autoId() }), attributeValues: util.dynamodb.toMapValues(values), }; } export function response(ctx) { return ctx.result; }
    2. 将函数添加到解析器中。

在这种情况下,请求函数返回一个简单的PutItem请求todoid,其中包含作为参数提供的特定内容,但是您可以使用该utils.autoid()实用程序为注释创建唯一的排序键。