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

Zak*_*ngh 10 amazon-web-services amazon-dynamodb aws-appsync

架构:

type User {
    id: ID!
    createdCurricula: [Curriculum]
}

type Curriculum {
    id: ID!
    title: String!
    creator: User!
}
Run Code Online (Sandbox Code Playgroud)

查询给定用户的所有课程的解析器:

    {
    "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
    }
Run Code Online (Sandbox Code Playgroud)

响应图:

{
"items": $util.toJson($context.result.items),
"nextToken": #if(${context.result.nextToken}) "${context.result.nextToken}" #else null #end
}
Run Code Online (Sandbox Code Playgroud)

查询:

query {
  getUser(id: "0b6af629-6009-4f4d-a52f-67aef7b42f43") {
    id
    createdCurricula {
      title
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

错误:

{
  "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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

CurriculumTable 有一个名为 userIdIndex 的全局二级索引,它以 userId 作为分区键。

如果我将响应映射更改为:

$util.toJson($context.result.items)
Run Code Online (Sandbox Code Playgroud)

输出如下:

{
  "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."
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果我使用该字符串并通过前端应用程序中的 console.log 运行它,我会得到:

{
[{"id":"2","userId":"0b6af629-6009-4f4d-a52f-67aef7b42f43"},{"id":"1","userId":"0b6af629-6009-4f4d-a52f-67aef7b42f43"}]
}
Run Code Online (Sandbox Code Playgroud)

那显然是一个对象。我如何使它...不是对象,以便 AppSync 将其正确读取为列表?

解决方案

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

小智 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