ошибка несоответствия типа, ожидаемый СПИСОК типов для запроса отношения "один ко многим" в 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 правильно читал его как список?

РЕШЕНИЕ

Моя карта ответов была заключена в фигурные скобки. Я почти уверен, что это было помещено в генератор Amazon. Удаление их исправило.


person Zak Singh    schedule 28.01.2018    source источник


Ответы (3)


изменить тип результата на $ util.toJson ($ ctx.result.data.posts)

person Naresh Choudhary    schedule 12.12.2019

Я думаю, что не вижу полного представления вашей схемы, я ожидал чего-то вроде:

schema {
   query: Query
}

Если Query - это RootQuery, на самом деле вы не передали нам свое определение запроса. Предполагая, что у вас есть правильное определение запроса. Основная проблема в вашем шаблоне ответа.

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

Это означает, что вы передаете коллекцию с именем: * "items" * в механизм запросов Graphql. И вы называете эту коллекцию «createdCurricula». Итак, решите эту проблему, ваш шаблон отображения ответов - то самое подходящее место для исправления. Как? просто замените строку выше следующей.

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

Пожалуйста, обратите внимание, что шаблон сопоставления - это мост между вашими источниками данных и qraphql, не стесняйтесь выполнять любые вычисления или сопоставление имен, но не забывайте, что имена объектов в этом ответе json должны совпадать в схеме / определение запроса.

Спасибо.

Musema

person Musema    schedule 05.08.2018

В сообщении об исключении говорится, что ожидается список типов.

Смотря на:

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

person Lisa M Shon    schedule 29.01.2018