如何通过graphQL和AWS AppSync发送JSON数组以将数据添加到Dynamo Table?

时间:2019-07-25 14:52:34

标签: javascript amazon-dynamodb aws-appsync

我想要做的是通过AppSync从React Native应用程序发送数据,以便我可以更新发电机表上的用户数据。我可以执行所有的CRUD操作,而不仅仅是数据列表。尝试时,出现错误消息,我发送的不是有效的JSON。但是,当我通过JSON linter进行输入时,我的输入将作为有效JSON传递。

为尝试解决此问题,我将输入流程更改为最简单的过程。最初,我是从本地缓存的已解析JSON字符串中提取JSON的。我认为JSON.parse(obj)函数可能存在问题。那没有理由。因此,我将所有输入都从JS对象移到了JSON中,该JSON事先没有存储在变量中,而是直接传递给我正在使用的API(https://aws-amplify.github.io/docs/js/api)。

在此操作不起作用之后,我以为我的GraphQL模式对于我发送的对象类型可能是错误的,但没有发现任何问题。

我在使用GraphQL的AppSync中的架构定义如下:

input CreateUserInput {
  email: String!
  data: AWSJSON
}

我发送的请求如下:

const dbReturn = await API.graphql(graphqlOperation(
  mutations.createUser, {
    input: {
      "email": "fake.email@atdot.com",
      "data": [{
        "num": 34,
      }]
    }
  }
));

错误消息显示:

  

“变量'数据'的值无效。无法将[{num = 34}]解析为   有效的JSON。”

令我困惑的是,"[{num=34}]"不是我提供的输入。我正在发送"[{"num": 34}]"这是有效的JSON。我希望它能够解析我的输入并将数据发送到我的dynamo表,因为JSON输入是有效的。

有人有什么想法可以克服这个问题吗?谢谢您的帮助!

3 个答案:

答案 0 :(得分:0)

弄清楚了。答案在于GraphQL模式。

"createUser": {
    "email": "Hello, world!",
    "data": "{\"key\":\"value\"}",
}

“复杂数据类型”的输入只是一个字符串。因此,在发出请求时,您只需要像JSON.stringify(variable.data)这样传递数据即可。我希望这可以对整个过程有所帮助。

答案 1 :(得分:0)

我遇到了相反的问题。我没有使用代码来创建查询,而是直接使用gql。如果我在输入中使用String,那么我的数据库中会得到一个字符串化的JSON,这不是我想要的。 相反,我必须确保周围没有引号-在您的情况下为num

架构

Item {
 data: AWSJSON
}
ItemInput {
  data: AWSJSON
}

查询

mutation {
 createUser {
   data: { num: 34 } // Not { "num": 34 }
 }
}

这可以确保我的数据不存储为字符串,并且在查询时可以返回可解析的JSON,而不是引号引起来的字符串。

我的VTL模板对突变做任何不寻常的事情,但在查询中我确实返回为:

{
  "data" :  $util.toJson($ctx.result.get('data')) // OR $ctx.result.get('data').toJSON()
}

答案 2 :(得分:0)

在此图中,源是可以保存对象或数组的AWSJSON类型,如果您要使用突变,因为它是JSON对象,则需要进行转义以在应用程序同步中创建项目。 enter image description here

enter image description here