我想要做的是通过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输入是有效的。
有人有什么想法可以克服这个问题吗?谢谢您的帮助!
答案 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)