架构:
type User {
id: ID!
createdCurricula: [Curriculum]
}
type Curriculum {
id: ID!
title: String!
creator: User!
}
解析器查询给定用户的所有课程:
{
"version" : "2017-02-28",
"operation" : "Query",
"query" : {
## Provide a query expression. **
"expression": "userId = :userId",
"expressionValues" : {
":userId" : {
"S" : "${context.source.id}"
}
}
},
"index": "userIdIndex",
"limit": #if(${context.arguments.limit}) ${context.arguments.limit} #else 20 #end,
"nextToken": #if(${context.arguments.nextToken}) "${context.arguments.nextToken}" #else null #end
}
响应图:
{
"items": $util.toJson($context.result.items),
"nextToken": #if(${context.result.nextToken}) "${context.result.nextToken}" #else null #end
}
查询:
query {
getUser(id: "0b6af629-6009-4f4d-a52f-67aef7b42f43") {
id
createdCurricula {
title
}
}
}
错误:
{
"data": {
"getUser": {
"id": "0b6af629-6009-4f4d-a52f-67aef7b42f43",
"createdCurricula": null
}
},
"errors": [
{
"path": [
"getUser",
"createdCurricula"
],
"locations": null,
"message": "Can't resolve value (/getUser/createdCurricula) : type mismatch error, expected type LIST"
}
]
}
CurriculumTable有一个名为userIdIndex的全局二级索引,其中userId为分区键。
如果我将响应图更改为:
$util.toJson($context.result.items)
输出如下:
{
"data": {
"getUser": {
"id": "0b6af629-6009-4f4d-a52f-67aef7b42f43",
"createdCurricula": null
}
},
"errors": [
{
"path": [
"getUser",
"createdCurricula"
],
"errorType": "MappingTemplate",
"locations": [
{
"line": 4,
"column": 5
}
],
"message": "Unable to convert \n{\n [{\"id\":\"87897987\",\"title\":\"Test Curriculum\",\"userId\":\"0b6af629-6009-4f4d-a52f-67aef7b42f43\"}],\n} to class java.lang.Object."
}
]
}
如果我接受该字符串并通过我的前端应用程序中的console.log运行它,我得到:
{
[{"id":"2","userId":"0b6af629-6009-4f4d-a52f-67aef7b42f43"},{"id":"1","userId":"0b6af629-6009-4f4d-a52f-67aef7b42f43"}]
}
这显然是一个对象。我如何使它...不是一个对象,以便AppSync正确地将其作为列表读取?
解
我的回复地图周围有一组花括号。我非常确定亚马逊将它放在发电机中。删除它们固定它。
答案 0 :(得分:1)
将结果类型更改为$ util.toJson($ ctx.result.data.posts)
答案 1 :(得分:0)
msg说它预期会出现一个类型列表。
看着:
{
[{"id":"2","userId":"0b6af629-6009-4f4d-a52f-67aef7b42f43"},{"id":"1","userId":"0b6af629-6009-4f4d-a52f-67aef7b42f43"}]
}
我没有看到createdCurricula
是列表。
目前在DDB中的是:
"id": "0b6af629-6009-4f4d-a52f-67aef7b42f43",
"createdCurricula": null
答案 2 :(得分:-1)
我认为我没有看到您的架构的完整视图,我期望像这样的东西:
schema {
query: Query
}
当查询为 RootQuery 时,实际上您没有与我们分享您的 Query 定义。假设您具有正确的查询定义。主要问题在于您的响应模板。
> "items": $util.toJson($context.result.items)
这意味着您正在将名为:*“ items ” *的集合传递给Graphql查询引擎。并且您将此集合称为“ createdCurricula ”。因此,解决此问题,您的响应映射模板是正确的解决方法。怎么样?只需用以下内容替换上面的行即可。
"createdCurricula": $util.toJson($context.result.items),
请注意,映射模板是您的数据源和qraphql之间的桥梁,可以随意进行任何计算或名称映射,但是请不要忘记,响应json中的对象名称应该是在模式/查询定义中匹配。
谢谢。
博物馆