Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过graphQL和AWS AppSync发送JSON数组以向Dynamo表添加数据?_Javascript_Amazon Dynamodb_Aws Appsync - Fatal编程技术网

Javascript 如何通过graphQL和AWS AppSync发送JSON数组以向Dynamo表添加数据?

Javascript 如何通过graphQL和AWS AppSync发送JSON数组以向Dynamo表添加数据?,javascript,amazon-dynamodb,aws-appsync,Javascript,Amazon Dynamodb,Aws Appsync,我试图做的是通过AppSync从React本机应用程序发送数据,以便更新dynamo表上的用户数据。我可以执行所有CRUD操作,但不能执行数据列表。当我尝试时,我得到一个错误,即我发送的不是有效的JSON。但是,当我将输入作为有效的JSON传递到JSON linter中时,它将作为有效的JSON传递 为了尝试解决这个问题,我将输入流更改为最简单的流程。最初,我是从本地缓存的已解析JSON字符串中提取JSON。我认为JSON.parse(obj)函数可能有问题。那不合乎情理。因此,我将所有输入从一

我试图做的是通过AppSync从React本机应用程序发送数据,以便更新dynamo表上的用户数据。我可以执行所有CRUD操作,但不能执行数据列表。当我尝试时,我得到一个错误,即我发送的不是有效的JSON。但是,当我将输入作为有效的JSON传递到JSON linter中时,它将作为有效的JSON传递

为了尝试解决这个问题,我将输入流更改为最简单的流程。最初,我是从本地缓存的已解析JSON字符串中提取JSON。我认为JSON.parse(obj)函数可能有问题。那不合乎情理。因此,我将所有输入从一个JS对象中移出,并放入一个JSON中,该JSON事先没有存储在变量中,而是直接传递给我正在使用的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,
      }]
    }
  }
));
错误消息显示:

变量“data”的值无效。无法将[{num=34}]作为 有效的JSON。“

让我困惑的是,
“[{num=34}]”
不是我给出的输入。我正在发送它,它是有效的JSON。我希望它能够解析我的输入并将数据发送到dynamo表,因为JSON输入是有效的


有人知道我能做些什么来克服这一切吗?谢谢你的帮助

找到了答案。答案在于GraphQL模式

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

“复杂数据类型”的输入只是一个字符串。因此,在发出请求时,您只需将数据作为类似于
JSON.stringify(variable.data)
的内容传入即可。我希望这能帮助一些人。

我的问题正好相反。我不是使用代码创建查询,而是直接使用gql。如果我在输入中使用字符串,那么我会在数据库中得到一个字符串化的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()
}

在这幅图中,源是AWSJSON类型,它可以保存对象或数组,如果您想使用变体,因为它是JSON对象,您需要执行escape以在应用程序同步中创建该项。


这叫逃逸:)