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

时间:2018-10-17 07:39:58

标签: amazon-web-services amazon-dynamodb aws-appsync vtl apache-velocity

我在寻找良好的来源/找出如何正确向AppSync GraphQL突变添加服务器端验证方面遇到问题。

本质上,我使用AWS仪表板定义了我的AppSync模式,因此为我创建了DynamoDB表,并为数据设置了一些基本解析器。

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

  1. 我有一个拥有inventorygold的玩家
  2. 玩家使用purchaseItem调用item_id变异
  3. 调用此突变后,我需要在解析器中执行一些检查,即检查item_id是否存在于关联的DynamoDB的“项目”表中,再次检查玩家是否有足够的黄金,再次在关联的DynamoDB的“玩家”表中,如果是这样,请通过向其库存中添加项目并减去新的黄金量来写入Players DynamoDB表。

我相信实现此目标最有效的方法,可以减少成本和延迟,是对AppSync使用“ Apache Velocity”模板语言吗?

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

2 个答案:

答案 0 :(得分:0)

要使用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
 }
     

这基于分页查询模板。

答案 1 :(得分:0)

您要查看的是管道解析器: https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html

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

这使您可以执行读取,写入,验证以及使用VTL进行的任何操作。您基本上要做的就是将输入和输出链接到下一个模板,然后进行所需的过程。

以下是中级帖子,向您展示如何操作:

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

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