解析器中的 AppSync GraphQL 突变服务器逻辑
AppSync GraphQL mutation server logic in resolvers
我在为我的 AppSync GraphQL 突变寻找好的来源/弄清楚如何正确添加服务器端验证时遇到问题。
本质上,我使用 AWS 仪表板来定义我的 AppSync 架构,因此为我创建了 DynamoDB table,并为数据设置了一些基本的解析器。
不,我需要实现以下目标:
- 我有一个玩家拥有
inventory
和 gold
- 玩家用
item_id
调用purchaseItem
突变
- 调用此突变后,我需要在解析器中执行一些检查,即检查
item_id
是否存在关联 DynamoDB 的 int 'Items' table,再次检查玩家是否有足够的金币在关联的 DynamoDB 的 'Players' table 中,如果是这样,请写入 Players
DynamoDB table 通过将项目添加到他们的库存和新减去的黄金数量。
我认为实现此目的的最有效方法是使用 "Apache Velocity" AppSync 模板语言?
很高兴看到这个示例展示了如何查询/写入 DynamoDB、处理错误并正确解决变更。
要使用 VTL 写入 DynamoDB,请使用以下 tutorial
you can start with the PutItem template. My request template looks like this:
{
"version" : "2017-02-28",
"operation" : "PutItem",
"key" : {
"noteId" : { "S" : "${context.arguments.noteId}" },
"userId" : { "S" : "${context.identity.sub}" }
},
"attributeValues" : {
"title" : { "S" : "${context.arguments.title}" },
"content": { "S" : "${context.arguments.content}" }
}
}
查询:
{ "version" : "2017-02-28",
"operation" : "Query",
"query" : {
## Provide a query expression. **
"expression": "userId = :userId",
"expressionValues" : {
":userId" : {
"S" : "${context.identity.sub}"
}
}
},
## Add 'limit' and 'nextToken' arguments to this field in your schema to implement pagination. **
"limit": #if(${context.arguments.limit}) ${context.arguments.limit} #else 20 #end,
"nextToken": #if(${context.arguments.nextToken}) "${context.arguments.nextToken}" #else null #end
}
This is based on the Paginated Query template.
你想看的是管道解析器:
https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html
是的,这需要 VTL(速度模板)
这使您可以使用 VTL 执行读取、写入、验证以及任何您想执行的操作。您基本上要做的是将输入和输出链接到下一个模板并进行所需的处理。
这里有一个 Medium post 向您展示如何操作:
https://medium.com/@dabit3/intro-to-aws-appsync-pipeline-functions-3df87ceddac1
换句话说,你可以做的是:
有一个查询数据库的模板,将结果通过管道传输到另一个验证结果的模板,并在成功或失败时将其插入。
我在为我的 AppSync GraphQL 突变寻找好的来源/弄清楚如何正确添加服务器端验证时遇到问题。
本质上,我使用 AWS 仪表板来定义我的 AppSync 架构,因此为我创建了 DynamoDB table,并为数据设置了一些基本的解析器。
不,我需要实现以下目标:
- 我有一个玩家拥有
inventory
和gold
- 玩家用
item_id
调用 - 调用此突变后,我需要在解析器中执行一些检查,即检查
item_id
是否存在关联 DynamoDB 的 int 'Items' table,再次检查玩家是否有足够的金币在关联的 DynamoDB 的 'Players' table 中,如果是这样,请写入Players
DynamoDB table 通过将项目添加到他们的库存和新减去的黄金数量。
purchaseItem
突变
我认为实现此目的的最有效方法是使用 "Apache Velocity" AppSync 模板语言?
很高兴看到这个示例展示了如何查询/写入 DynamoDB、处理错误并正确解决变更。
要使用 VTL 写入 DynamoDB,请使用以下 tutorial
you can start with the PutItem template. My request template looks like this:
{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { "noteId" : { "S" : "${context.arguments.noteId}" }, "userId" : { "S" : "${context.identity.sub}" } }, "attributeValues" : { "title" : { "S" : "${context.arguments.title}" }, "content": { "S" : "${context.arguments.content}" } } }
查询:
{ "version" : "2017-02-28", "operation" : "Query", "query" : { ## Provide a query expression. ** "expression": "userId = :userId", "expressionValues" : { ":userId" : { "S" : "${context.identity.sub}" } } }, ## Add 'limit' and 'nextToken' arguments to this field in your schema to implement pagination. ** "limit": #if(${context.arguments.limit}) ${context.arguments.limit} #else 20 #end, "nextToken": #if(${context.arguments.nextToken}) "${context.arguments.nextToken}" #else null #end }
This is based on the Paginated Query template.
你想看的是管道解析器: https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html
是的,这需要 VTL(速度模板)
这使您可以使用 VTL 执行读取、写入、验证以及任何您想执行的操作。您基本上要做的是将输入和输出链接到下一个模板并进行所需的处理。
这里有一个 Medium post 向您展示如何操作:
https://medium.com/@dabit3/intro-to-aws-appsync-pipeline-functions-3df87ceddac1
换句话说,你可以做的是: 有一个查询数据库的模板,将结果通过管道传输到另一个验证结果的模板,并在成功或失败时将其插入。