"类型不匹配错误,预期类型列表"用于在AppSync中查询一对多关系

时间:2018-01-28 03:28:30

标签: amazon-web-services amazon-dynamodb aws-appsync

架构:

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正确地将其作为列表读取?

我的回复地图周围有一组花括号。我非常确定亚马逊将它放在发电机中。删除它们固定它。

3 个答案:

答案 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中的对象名称应该是在模式/查询定义中匹配。

谢谢。

博物馆