10

架构:

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

解决方案

我的响应地图周围有一组花括号。我很确定它是由亚马逊放置在生成器中的。删除它们修复了它。

4

3 回答 3

1

将结果类型更改为 $util.toJson($ctx.result.data.posts)

于 2019-12-12T07:33:58.077 回答
1

我想我没有看到您架构的完整视图,我期待的是:

schema {
   query: Query
}

其中 Query 是RootQuery,实际上您没有与我们分享您的Query定义。假设您有正确的查询定义。主要问题出在您的响应模板中。

> "items": $util.toJson($context.result.items)

这意味着您将一个名为:*" items "* 的集合传递给 Graphql 查询引擎。而您将此集合称为“ createdCurricula ”。所以解决这个问题,你的 response-mapping-template 是修复的正确位置。如何?只需将上面的行替换为以下内容。

"createdCurricula": $util.toJson($context.result.items),

请在这里注意的主要事项是,映射模板是您的数据源和 qraphql 之间的桥梁,请随意进行任何计算或名称映射,但不要忘记该响应 json 中的对象名称应该在模式中匹配/查询定义。

谢谢。

博物馆

于 2018-08-05T16:57:07.583 回答
0

异常消息表明它需要一个类型列表。

看着:

{ [{"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

于 2018-01-29T05:26:45.413 回答