AWS AppSync:如何通过 DynamoDB 返回有效的 JSON

Posted

技术标签:

【中文标题】AWS AppSync:如何通过 DynamoDB 返回有效的 JSON【英文标题】:AWS AppSync: How to return valid JSON via DynamoDB 【发布时间】:2019-03-21 06:54:09 【问题描述】:

我有一个 AppSync GraphQL API,它对 DynamoDB 进行查询并返回 JSON 字符串,但是在我的响应映射模板中,我使用了 here 中列出的内置 $util.parseJson() 函数 - 但我仍然返回查询窗口中的 JSON 字符串以及在我的 React 应用程序中请求数据时。

架构文件,我有一个 AWSJSON 类型的普通 ID 和地址字段。

type Venue 
  id: ID!
  address: AWSJSON

在运行突变时,我通常通过快速JSON.stringify(addressObj) 运行地址对象,并将对象格式化为字符串,其中 \"\" 转义,这意味着它可以插入到 DynamoDB 中。

请求映射模板


  "version": "2017-02-28",
  "operation": "GetItem",
  "key": 
    "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
  

响应映射模板

#set($result = $ctx.result)

## address - parse back to JSON
#set($result.address = $util.parseJson($ctx.result.address))

## Return the result
$util.toJson($result)

创建一个新变量然后将值分配给parseJSON 值的想法取自How return JSON object from DynamoDB with appsync?。因此,如下所示,我正在通过似乎将其从字符串化 JSON 转换为对象的正确方法解析该值 - 但它似乎不起作用。

目前的反应:


  "data": 
    "getVenue": 
      "id": "31538150",
      "address": "\"lng\":-1.54511300000001,\"postcode\":\"LS1 5DL\",\"short\":\"New Station St., LS1\",\"lat\":53.795231,\"full\":\"16 New Station St, Leeds LS1 5DL, UK\""
    
  

而我想要的回应是......


  "data": 
    "getVenue": 
      "id": "31538150",
      "address":  "lng": -1.54511300000001, "postcode": "LS1 5DL", "short": "New Station St., LS1", "lat": 53.795231, "full": "16 New Station St, Leeds LS1 5DL, UK" 
    
  

非常感谢任何帮助!

【问题讨论】:

如果你看这个documentationAWJSON代表一个JSON string。它还说they will automatically be parsed and loaded in the resolver mapping templates as Maps, Lists, or Scalar values rather than as the literal input strings. @LisaMShon 谢谢,所以不是在突变之前对 JSON 进行字符串化,您是否只需要简单地将 JSON 提供给突变,然后在解析器映射模板中执行一个步骤来对其进行字符串化,然后再保存进入 Dynamo? @TomHanson 直觉表明您对address 的字符串化次数超出了您的预期。确认这一点的临时测试可能是#set($result.address = $util.parseJson($util.parseJson($ctx.result.address))) 【参考方案1】:

老问题,但我想我会添加一些注释...

AWSJSON 是一个字符串值,它将作为 JSON 解析到 DynamoDB 中,并在获取时再次进行字符串化。

所以 AppSync 需要一个字符串(字符串化 JSON)作为输入,并将返回一个可以用 JSON.parse 解析的字符串。

但是,此数据在存储到 DynamoDB 之前会被解析。因此,你们中的一些人单独查询 DynamoDB,而不是通过 AppSync,然后您可以像查询对象一样查询它。与直接输入 DynamoDB 相同。

在 AppSync 结果中获取 JSON 的唯一方法是在 GraphQL 中定义每个字段。有时这可以通过重组数据来实现。例如,而不是存储:


   bob:  age: 34 ,
   igor:  age: 124 

需要将其字符串化为 AWSJSON 字段。然而,它可以像这样重组:

[
   name: 'bob',
   age: 34
 ,  
   name: 'igor',
   age: 123
]

在 GraphQL 中可以这样定义:

type User 
  age: Int,
  name: String

因此,现在可以从 GraphQL 中提取特定值,例如 age,而无需涉及 JSON 解析/字符串化。

【讨论】:

以上是关于AWS AppSync:如何通过 DynamoDB 返回有效的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?

具有业务逻辑的 AWS Appsync + DynamoDB

使用 AWS AppSync 将项目附加到 DynamoDB

Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目

AWS AppSync GraphQL - 如何使用 PK/SK 查询而不是扫描整个 dynamoDB 表以获取 graphql 列表 API

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