创建基本查询(JavaScript)
GraphQL 解析器将类型的架构中的字段连接到数据来源。解析器是用于完成请求的机制。
Amazon AppSync 中的解析器使用 JavaScript,将 GraphQL 表达式转换为数据来源可使用的格式。或者,可以使用 Apache Velocity 模板语言 (VTL)
本节介绍了如何使用 JavaScript 配置解析器。解析器教程 (JavaScript) 一节提供了有关如何使用 JavaScript 实施解析器的深入教程。解析器参考 (JavaScript) 一节说明了可以与 JavaScript 解析器一起使用的实用程序操作。
我们建议您在尝试使用任何上述教程之前先遵循本指南。
在本节中,我们将介绍如何为查询和变更创建和配置解析器。
注意
本指南假设您已创建架构并至少具有一个查询或变更。如果您要获取订阅(实时数据),请参阅本指南。
在本节中,我们提供一些配置解析器的常规步骤以及一个使用以下架构的示例:
// schema.graphql file input CreatePostInput { title: String date: AWSDateTime } type Post { id: ID! title: String date: AWSDateTime } type Mutation { createPost(input: CreatePostInput!): Post } type Query { getPost: [Post] }
创建基本查询解析器
本节说明了如何创建基本查询解析器。
- Console
-
-
登录到 Amazon Web Services Management Console,然后打开 AppSync 控制台
。 -
在 API 控制面板中,选择您的 GraphQL API。
-
在侧边栏中,选择架构。
-
-
在架构编辑器旁边,具有一个名为解析器的窗口。该框包含架构窗口中定义的类型和字段列表。您可以将解析器附加到字段。您很可能会将解析器附加到字段操作。在本节中,我们将了解简单的查询配置。在 Query 类型下面,选择您的查询字段旁边的附加。
-
在附加解析器页面上的解析器类型下面,您可以在管道解析器和单位解析器之间进行选择。有关这些类型的更多信息,请参阅解析器。本指南将使用
pipeline resolvers
。提示
在创建管道解析器时,您的数据来源将附加到管道函数。函数是在您创建管道解析器本身之后创建的,这就是为什么在该页面中没有设置数据来源的选项。如果您使用单位解析器,则数据来源直接绑定到解析器,因此,您可以在该页面中设置数据来源。
对于解析器运行时,选择
APPSYNC_JS
以启用 JavaScript 运行时系统。 -
您可以为该 API 启用缓存。我们建议暂时关闭该功能。选择创建。
-
在编辑解析器页面上,具有一个名为解析器代码的代码编辑器,可用于实施解析器处理程序和响应的逻辑(预备步骤和后续步骤)。有关更多信息,请参阅 JavaScript 解析器概述。
注意
在我们的示例中,我们直接将请求保留空白,并将响应设置为从上下文返回最后的数据来源结果:
import {util} from '@aws-appsync/utils'; export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }
在该部分下面,具有有一个名为函数的表。函数用于实施可以在多个解析器中重复使用的代码。您可以将源代码存储为函数以在需要时添加到解析器中,而不是不断重新编写或复制代码。
函数占据了管道的操作列表中的很大部分。在解析器中使用多个函数时,您可以设置函数顺序,将按该顺序运行它们。它们在请求函数运行之后和响应函数开始之前执行。
要添加新函数,请在函数下面选择添加函数,然后选择创建新函数。或者,您可能会看到一个创建函数按钮可供选择。
-
选择一个数据来源。这是解析器处理的数据来源。
注意
在我们的示例中,我们为
getPost
附加一个解析器,它按id
检索Post
对象。假设我们已为该架构设置一个 DynamoDB 表。其分区键设置为id
并且为空。 -
输入一个
Function name
。 -
在函数代码下面,您需要实施函数的行为。这可能会令人困惑,但每个函数具有自己的本地请求和响应处理程序。先运行请求,然后调用数据来源以处理请求,最后由响应处理程序处理数据来源响应。结果存储在上下文对象中。然后,运行列表中的下一个函数;如果是最后一个函数,则将其传递给后续步骤响应处理程序。
注意
在我们的示例中,我们将一个解析器附加到
getPost
,它从数据来源获取Post
对象列表。我们的请求函数从表中请求数据,表将其响应传递给上下文 (ctx),然后响应在上下文中返回结果。Amazon AppSync 的优势在于它与其他 Amazon 服务之间的互连。由于我们使用的是 DynamoDB,因此,我们具有一组操作以简化此类操作。我们还具有其他数据来源类型的一些样板示例。我们的代码将如下所示:
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 post items */ export function response(ctx) { return ctx.result.items; }
在该步骤中,我们添加了两个函数:
-
request
:请求处理程序对数据来源执行检索操作。参数包含上下文对象 (ctx
) 或为执行特定操作的所有解析器提供的一些数据。例如,它可能包含授权数据、解析的字段名称等。返回语句执行Scan
操作(请参阅此处的示例)。由于我们使用的是 DynamoDB,因此,我们可以使用该服务中的一些操作。扫描对表中的所有项目执行基本获取。该操作的结果作为result
容器存储在上下文对象中,然后再传递给响应处理程序。request
在管道中的响应之前运行。 -
response
:返回request
输出的响应处理程序。参数是更新的上下文对象,返回语句是ctx.prev.result
。在本指南的当前阶段,您可能还不熟悉该值。ctx
指的是上下文对象。prev
指的是管道中的以前操作,也就是request
。result
包含在管道中执行解析器的结果。如果将它们放在一起,ctx.prev.result
将返回最后执行的操作的结果,即请求处理程序。
-
-
在完成后,选择创建。
-
-
返回到解析器屏幕,在函数下面选择添加函数下拉列表,然后将您的函数添加到函数列表中。
-
选择保存以更新解析器。
-
- CLI
-
添加您的函数
-
使用
create-function
命令为管道解析器创建一个函数。您需要为该特定命令输入一些参数:
-
您的 API 的
api-id
。 -
Amazon AppSync 控制台中的函数的
name
。 -
data-source-name
或函数使用的数据来源名称。它必须已创建并链接到 Amazon AppSync 服务中的 GraphQL API。 -
runtime
或函数的环境和语言。对于 JavaScript,名称必须是APPSYNC_JS
,运行时系统必须是1.0.0
。 -
code
或函数的请求和响应处理程序。虽然您可以手动键入该内容,但将其添加到 .txt 文件(或类似格式)并作为参数传入要容易得多。注意
我们的查询代码将位于作为参数传入的文件中:
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 post items */ export function response(ctx) { return ctx.result.items; }
示例命令可能如下所示:
aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name get_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file://~/path/to/file/{filename}.{fileType}
将在 CLI 中返回输出。示例如下:
{ "functionConfiguration": { "functionId": "ejglgvmcabdn7lx75ref4qeig4", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/ejglgvmcabdn7lx75ref4qeig4", "name": "get_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output goes here
" } }注意
确保将
functionId
记录在某处,因为它用于将函数附加到解析器。 -
创建您的解析器
-
运行
create-resolver
命令,为Query
创建一个管道函数。您需要为该特定命令输入一些参数:
-
您的 API 的
api-id
。 -
type-name
或架构中的特殊对象类型(查询、变更、订阅)。 -
field-name
或要将解析器附加到的特殊对象类型中的字段操作。 -
kind
,它指定单位解析器或管道解析器。请将其设置为PIPELINE
以启用管道函数。 -
pipeline-config
或附加到解析器的函数。确保您知道函数的functionId
值。列表顺序很重要。 -
runtime
,它是APPSYNC_JS
(JavaScript)。runtimeVersion
目前是1.0.0
。 -
code
,它包含预备步骤和后续步骤处理程序。注意
我们的查询代码将位于作为参数传入的文件中:
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; }
示例命令可能如下所示:
aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Query \ --field-name getPost \ --kind PIPELINE \ --pipeline-config functions=ejglgvmcabdn7lx75ref4qeig4 \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}
将在 CLI 中返回输出。示例如下:
{ "resolver": { "typeName": "Mutation", "fieldName": "getPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/getPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "ejglgvmcabdn7lx75ref4qeig4" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output goes here
" } } -
-
- CDK
-
提示
基本应用程序需要使用以下内容:
-
服务导入指令
-
架构代码
-
数据来源生成器
-
函数代码
-
解析器代码
从设计您的架构和附加数据来源小节中,我们知道堆栈文件将包含以下格式的 import 指令:
import * as
x
from 'x
'; # import wildcard as the 'x' keyword from 'x-service' import {a
,b
, ...} from 'c
'; # import {specific constructs} from 'c-service'注意
在前面的几节中,我们仅说明了如何导入 Amazon AppSync 构造。在实际代码中,您必须导入更多服务才能运行应用程序。在我们的示例中,如果我们要创建非常简单的 CDK 应用程序,我们至少需要导入 Amazon AppSync 服务以及我们的数据来源(即 DynamoDB 表)。我们还需要导入一些额外的构造以部署应用程序:
import * as cdk from 'aws-cdk-lib'; import * as appsync from 'aws-cdk-lib/aws-appsync'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import { Construct } from 'constructs';
简要说明一下每个指令:
-
import * as cdk from 'aws-cdk-lib';
:用于定义 CDK 应用程序和构造,例如堆栈。它还包含一些对我们的应用程序非常有用的实用程序函数,例如处理元数据。如果您熟悉该 import 指令,但想知道为什么此处没有使用 cdk 核心库,请参阅 Migration 页面。 -
import * as appsync from 'aws-cdk-lib/aws-appsync';
:它导入 Amazon AppSync 服务。 -
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
:它导入 DynamoDB 服务。 -
import { Construct } from 'constructs';
:我们需要使用该指令以定义根构造。
导入类型取决于您调用的服务。我们建议查看 CDK 文档以获取示例。页面顶部的架构是 CDK 应用程序中的单独文件,显示为
.graphql
文件。在堆栈文件中,我们可以使用以下格式将其与新的 GraphQL 相关联:const add_api = new appsync.GraphqlApi(this, 'graphQL-example', { name: 'my-first-api', schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'schema.graphql')), });
注意
在
add_api
范围内,我们使用new
关键字和后面的appsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps)
添加新的 GraphQL API。我们的范围是this
,CFN ID 是graphQL-example
,我们的属性是my-first-api
(控制台中的 API 的名称)和schema.graphql
(架构文件的绝对路径)。要添加数据来源,您必须先将数据来源添加到堆栈中。然后,您需要使用源特定的方法将其与 GraphQL API 相关联。在您创建解析器函数时,将会发生关联。同时,让我们使用一个通过
dynamodb.Table
创建 DynamoDB 表的示例:const add_ddb_table = new dynamodb.Table(this, 'posts-table', { partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING, }, });
注意
如果我们要在示例中使用该表,我们将添加一个 CFN ID 为
posts-table
且分区键为id (S)
的新 DynamoDB 表。接下来,我们需要在堆栈文件中实施解析器。以下是扫描 DynamoDB 表中的所有项目的简单查询示例:
const add_func = new appsync.AppsyncFunction(this, 'func-get-posts', { name: 'get_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'Scan' }; } export function response(ctx) { return ctx.result.items; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-get-posts', { add_api, typeName: 'Query', fieldName: 'getPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func], });
注意
首先,我们创建一个名为
add_func
的函数。这种创建顺序可能看起来有点违背常理,但您必须在创建管道解析器本身之前在解析器中创建函数。函数采用以下格式:AppsyncFunction(scope: Construct, id: string, props: AppsyncFunctionProps)
我们的范围是
this
,CFN ID 是func-get-posts
,属性包含实际函数详细信息。我们在属性中包含:-
在 Amazon AppSync 控制台 (
get_posts_func_1
) 中显示的函数的name
。 -
我们以前创建的 GraphQL API (
add_api
)。 -
数据来源;我们在其中将数据来源链接到 GraphQL API 值,然后将其附加到函数。我们获取创建的表 (
add_ddb_table
),并使用GraphqlApi
方法之一 (addDynamoDbDataSource
) 将其附加到 GraphQL API (add_api
)。ID 值 (table-for-posts
) 是 Amazon AppSync 控制台中的数据来源的名称。有关源特定的方法列表,请参阅以下页面: -
代码包含函数的请求和响应处理程序,这是简单的扫描和返回。
-
运行时系统指定我们要使用 APPSYNC_JS 运行时系统 1.0.0 版。请注意,这是目前唯一适用于 APPSYNC_JS 的版本。
接下来,我们需要将函数附加到管道解析器。我们使用以下格式创建解析器:
Resolver(scope: Construct, id: string, props: ResolverProps)
我们的范围是
this
,CFN ID 是pipeline-resolver-get-posts
,属性包含实际函数详细信息。我们在属性中包含:-
我们以前创建的 GraphQL API (
add_api
)。 -
特殊对象类型名称;这是一个查询操作,因此,我们直接添加了
Query
值。 -
字段名称 (
getPost
) 是架构中的Query
类型下面的字段名称。 -
代码包含预备步骤处理程序和后续步骤处理程序。我们的示例仅返回函数执行操作后在上下文中包含的任何结果。
-
运行时系统指定我们要使用 APPSYNC_JS 运行时系统 1.0.0 版。请注意,这是目前唯一适用于 APPSYNC_JS 的版本。
-
管道配置包含对我们创建的函数 (
add_func
) 的引用。
-
简要说明一下该示例中发生的情况,您看到了一个实施请求和响应处理程序的 Amazon AppSync 函数。该函数负责与您的数据来源进行交互。请求处理程序向 Amazon AppSync 发送 Scan
操作,指示它对 DynamoDB 数据来源执行什么操作。响应处理程序返回项目列表 (ctx.result.items
)。然后,将项目列表自动映射到 Post
GraphQL 类型。
创建基本变更解析器
本节说明了如何创建基本变更解析器。
- Console
-
-
登录到 Amazon Web Services Management Console,然后打开 AppSync 控制台
。 -
在 API 控制面板中,选择您的 GraphQL API。
-
在侧边栏中,选择架构。
-
-
在解析器部分的 Mutation 类型下面,选择您的字段旁边的附加。
注意
在我们的示例中,我们为
createPost
附加一个解析器,它将Post
对象添加到我们的表中。假设我们使用上一节中的相同 DynamoDB 表。其分区键设置为id
并且为空。 -
在附加解析器页面上的解析器类型下面,选择
pipeline resolvers
。提醒一下,您可以在此处找到有关解析器的更多信息。对于解析器运行时,选择APPSYNC_JS
以启用 JavaScript 运行时系统。 -
您可以为该 API 启用缓存。我们建议暂时关闭该功能。选择创建。
-
选择添加函数,然后选择创建新函数。或者,您可能会看到一个创建函数按钮可供选择。
-
选择您的 数据来源。这应该是使用变更处理数据的源。
-
输入一个
Function name
。 -
在函数代码下面,您需要实施函数的行为。这是一个变更,因此,理想情况下,请求将对调用的数据来源执行某种状态更改操作。结果由响应函数进行处理。
注意
createPost
在表中添加或“放置”新的Post
,并将我们的参数作为数据。我们可能会添如下内容:import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
在该步骤中,我们还添加了
request
和response
函数:-
request
:请求处理程序接受上下文以作为参数。请求处理程序返回语句执行PutItem
命令,这是内置的 DynamoDB 操作(请参阅此处或此处的示例)。PutItem
命令获取分区key
值(由util.autoid()
自动生成)以及来自上下文参数输入的attributes
(这些是在请求中传递的值),以将Post
对象添加到我们的 DynamoDB 表中。key
是id
,attributes
是date
和title
字段参数。它们通过util.dynamodb.toMapValues
帮助程序预先设置格式以与 DynamoDB 表一起使用。 -
response
:响应接受更新的上下文,并返回请求处理程序的结果。
-
-
在完成后,选择创建。
-
-
返回到解析器屏幕,在函数下面选择添加函数下拉列表,然后将您的函数添加到函数列表中。
-
选择保存以更新解析器。
-
- CLI
-
添加您的函数
-
使用
create-function
命令为管道解析器创建一个函数。您需要为该特定命令输入一些参数:
-
您的 API 的
api-id
。 -
Amazon AppSync 控制台中的函数的
name
。 -
data-source-name
或函数使用的数据来源名称。它必须已创建并链接到 Amazon AppSync 服务中的 GraphQL API。 -
runtime
或函数的环境和语言。对于 JavaScript,名称必须是APPSYNC_JS
,运行时系统必须是1.0.0
。 -
code
或函数的请求和响应处理程序。虽然您可以手动键入该内容,但将其添加到 .txt 文件(或类似格式)并作为参数传入要容易得多。注意
我们的查询代码将位于作为参数传入的文件中:
import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
示例命令可能如下所示:
aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name add_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}
将在 CLI 中返回输出。示例如下:
{ "functionConfiguration": { "functionId": "vulcmbfcxffiram63psb4dduoa", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/vulcmbfcxffiram63psb4dduoa", "name": "add_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output foes here
" } }注意
确保将
functionId
记录在某处,因为它用于将函数附加到解析器。 -
创建您的解析器
-
运行
create-resolver
命令,为Mutation
创建一个管道函数。您需要为该特定命令输入一些参数:
-
您的 API 的
api-id
。 -
type-name
或架构中的特殊对象类型(查询、变更、订阅)。 -
field-name
或要将解析器附加到的特殊对象类型中的字段操作。 -
kind
,它指定单位解析器或管道解析器。请将其设置为PIPELINE
以启用管道函数。 -
pipeline-config
或附加到解析器的函数。确保您知道函数的functionId
值。列表顺序很重要。 -
runtime
,它是APPSYNC_JS
(JavaScript)。runtimeVersion
目前是1.0.0
。 -
code
,它包含预备步骤和后续步骤。注意
我们的查询代码将位于作为参数传入的文件中:
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; }
示例命令可能如下所示:
aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Mutation \ --field-name createPost \ --kind PIPELINE \ --pipeline-config functions=vulcmbfcxffiram63psb4dduoa \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}
将在 CLI 中返回输出。示例如下:
{ "resolver": { "typeName": "Mutation", "fieldName": "createPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/createPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "vulcmbfcxffiram63psb4dduoa" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output goes here
" } } -
-
- CDK
-
提示
-
要创建变更,假设您使用同一项目,您可以将其添加到堆栈文件中,就像查询一样。以下是修改的函数和解析器,用于在表中添加新
Post
的变更:const add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', { name: 'add_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } export function response(ctx) { return ctx.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-create-posts', { add_api, typeName: 'Mutation', fieldName: 'createPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func_2], });
注意
由于该变更和查询的结构相似,因此,我们仅介绍为创建变更而进行的更改。
在该函数中,我们将 CFN ID 更改为
func-add-post
并将名称更改为add_posts_func_1
,以反映我们将Posts
添加到表中的情况。在数据来源中,我们在 Amazon AppSync 控制台中为表 (add_ddb_table
) 创建一个新关联 (table-for-posts-2
),因为addDynamoDbDataSource
方法需要这样做。请记住,该新关联仍使用我们以前创建的同一个表,但现在我们在 Amazon AppSync 控制台中具有该表的两个连接:一个连接 (table-for-posts
) 用于查询,另一个连接 (table-for-posts-2
) 用于变更。代码进行了更改以添加Post
,方法是自动生成其id
值,并接受客户端输入以用于其余字段。在解析器中,我们将 id 值更改为
pipeline-resolver-create-posts
以反映我们将Posts
添加到表中的情况。为了反映架构中的变更,类型名称更改为Mutation
,名称更改为createPost
。管道配置设置为我们的新变更函数add_func_2
。
-
简要说明一下该示例中发生的情况:Amazon AppSync 自动将 createPost
字段中定义的参数从 GraphQL 架构转换为 DynamoDB 操作。该示例使用 id
键将记录存储在 DynamoDB 中,该键是使用我们的 util.autoId()
帮助程序自动创建的。从请求(在 Amazon AppSync 控制台中或以其他方式发出)传递给上下文参数 (ctx.args.input
) 的所有其他字段将存储为表的属性。键和属性使用 util.dynamodb.toMapValues(values)
帮助程序自动映射到兼容的 DynamoDB 格式。
Amazon AppSync 还支持测试和调试编辑解析器所用的工作流。您可以在调用模板之前使用模拟 context
对象查看转换的模板值。或者,您可以选择在运行查询时以交互方式查看对数据来源的完整请求。有关更多信息,请参阅测试和调试解析器 (JavaScript) 和监控和日志记录。
高级解析器
如果您按照设计您的架构中的可选分页一节进行操作,您仍然需要将解析器添加到请求才能使用分页。我们的示例使用名为 getPosts
的查询分页,每次仅返回一部分请求内容。该字段上的解析器代码可能如下所示:
/** * 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: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
在请求中,我们传入请求的上下文。limit
是 20
,这意味着我们在第一个查询中最多返回 20 个 Posts
。nextToken
光标固定在数据来源中的第一个 Post
条目。这些内容将传递给参数。然后,请求执行从第一个 Post
到扫描限制数的扫描。数据来源将结果存储在上下文中,该结果将传递给响应。响应返回它检索的 Posts
,然后将 nextToken
设置为紧靠限制后面的 Post
条目。发出的下一个请求执行完全相同的操作,但从紧靠第一个查询后面的偏移开始。请记住,这些类型的请求是按顺序完成的,而不是并行完成的。