解析器中的 AppSync GraphQL 变异服务器逻辑

Posted

技术标签:

【中文标题】解析器中的 AppSync GraphQL 变异服务器逻辑【英文标题】:AppSync GraphQL mutation server logic in resolvers 【发布时间】:2019-03-21 19:44:25 【问题描述】:

我在为/弄清楚如何正确地将服务器端验证添加到我的 AppSync GraphQL 突变中时遇到问题。

本质上,我使用 AWS 控制面板来定义我的 AppSync 架构,因此为我创建了 DynamoDB 表,以及为数据设置的一些基本解析器。

不,我需要实现以下目标:

    我有一个玩家有inventorygold 玩家用item_id调用purchaseItem突变 一旦调用此突变,我需要在解析器中执行一些检查,即检查 item_id 是否存在关联 DynamoDB 的 int 'Items' 表,检查玩家是否有足够的金币,再次在关联 DynamoDB 的“玩家”表中,如果因此,通过将项目添加到他们的库存和新的减去黄金数量来写入Players DynamoDB 表。

我认为实现这一目标并降低成本和延迟的最有效方法是对 AppSync 使用“Apache Velocity”模板语言?

很高兴看到此示例展示如何查询/写入 DynamoDB、处理错误和正确解决突变。

【问题讨论】:

感谢您的提问。目前,AppSync 解析器针对单个数据源执行。您可以嵌套查询以在本文中概述的多个解析器之间传递上下文:hackernoon.com/… 我们正在评估在不更改架构结构的情况下执行此操作的方法,我将为您的请求 +1。请继续关注未来的最新 AppSync 公告。 @LisaMShon 感谢您将此转发给 AppSync 团队。同时,这样的解决方案可行吗? ***.com/questions/52903482/… 【参考方案1】:

要使用 VTL 写入 DynamoDB,请使用以下 tutorial

您可以从 PutItem 模板开始。我的请求模板如下所示:


"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
 

这是基于分页查询模板。

【讨论】:

我现在到了这一点,我的问题翻译成你的例子会是这样的。对于您的 PutItem 示例,您将如何扩展它以在将其放入之前检查数据库中是否没有其他具有相同标题的便笺?我认为这需要在该解析器中进行额外查询以及一些比较逻辑,这就是我目前卡住的地方。 @Ilja 见***.com/questions/19806688/… 感谢您提供有用的链接,它适用于这个特定的用例,但回到我原来的问题,这意味着购买物品和更新用户库存和黄金的更多自定义逻辑,这不会解决它(我只是想根据您在之前评论中的问题使用示例来查看解析器中如何处理自定义逻辑)【参考方案2】:

您想查看的是 Pipeline Resolvers: https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html

是的,这需要 VTL(速度模板)

这允许您使用 VTL 执行读取、写入、验证以及任何您喜欢的操作。您基本上所做的是将输入和输出链接到下一个模板并进行所需的流程。

这是一篇 Medium 帖子,向您展示了如何做到这一点:

https://medium.com/@dabit3/intro-to-aws-appsync-pipeline-functions-3df87ceddac1

换句话说,您可以做的是: 拥有一个查询数据库的模板,将结果通过管道传输到另一个模板,该模板验证结果并在成功或失败时将其插入。

【讨论】:

以上是关于解析器中的 AppSync GraphQL 变异服务器逻辑的主要内容,如果未能解决你的问题,请参考以下文章

从 lambda 调用 AWS AppSync GraphQL API 变异查询

aws amplify appsync 中的 Graphql 突变错误

AWS Appsync 一个 dynamodb 解析器中的多个 dynamodb 请求

Dynamo DB 中的 AWS AppSync 简单 graphql 解析器无法正常工作,这让我发疯

如何解决“变异返回数据为空”?

AppSync GraphQL 模拟解析器映射未生成唯一项目