Преобразователю полей GraphQL требуется контекстная информация

Возможно, моя терминология не точна. Я использую AWS AppSync. Моя схема:

type Book {
  title: String
  author: Author
}

type Author {
  name: String
}

type Query {
  getBook(title:String!): Book
}

Решатель для getBook возвращает объект в форме:

{
  title: <string>
  authorId: <number>
}

Где authorId всегда возвращается.

Я бы хотел указать преобразователь для поля Book.author, который будет получать authorId и извлекать этот объект из своего собственного хранилища данных. Это возможно?

Если то, что я пытаюсь сделать, невозможно, как правильно это сделать, где одно хранилище данных представляет собой таблицу с двумя столбцами - { title, authorId }, а в отдельном хранилище есть таблица со списком авторов, где основной Ключевым является столбец authorId. Поскольку это две разные службы, я не могу просто присоединиться два как SQL-запрос.

Функции распознавателя - это код, и, по сути, все возможно. Совершение двух вызовов и изменение формы данных в соответствии с форматом API, который вы планируете раскрыть, кажется очень разумным.

David Maze 22.09.2018 14:46
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
0
1
277
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, вам понадобится bookID в качестве идентификатора родителя внутри Author:

type Author {
    # parent's id
    bookID: ID!
    # author id
    id: ID!
    name: String!
}

type Book {
    id: ID!
    title: String!
    author: Author!
}

Когда Create Resource, просто сделайте:
- Book.id как primary key из BookTable
- Author.bookID как primary key и Author.id как sort key из AuthorTable

Также необходимо подключить преобразователь для Book.author с помощью $ctx.source.id

После того, как вы подключите распознаватель Book.author, все готово. Вы можете получить результат примерно так:

getBook(title: "xx") {
  id
  title
  author {
    id
    name
  }
}
Ответ принят как подходящий

Пока authorId возвращается из распознавателя getBook, он будет доступен через $ctx.source.authorId при разрешении Book.author.

Я воспроизвел ваш API с локальными преобразователями, используя вашу схему:

Шаблон отображения запроса Query.getBook:

{
    "version": "2018-05-29",
    "payload": {
        "title": "$context.arguments.title",
        "authorId": "2" ## returned in addition to other fields. It will be used by Book.author resolver.
    }
}

Шаблон сопоставления ответов Query.getBook:

$util.toJson($context.result)

Шаблон отображения запроса Book.author:

{
    "version": "2018-05-29",
    "payload": {
        "name": "author name with authorId: $context.source.authorId"
    }
}

Шаблон сопоставления ответов Book.author:

$util.toJson($context.result)

Следующий запрос:

query {
  getBook(title:"AWS AppSync") {
    title 
    author {
      name
    }
  }
}

даст результат:

{
  "data": {
    "getBook": {
      "title": "AWS AppSync",
      "author": {
        "name": "author name with authorId: 2"
      }
    }
  }
}

Другие вопросы по теме