Средство распознавания полей GraphQL нуждается в контекстной информации - PullRequest
0 голосов
/ 22 сентября 2018

Возможно, моя терминология не точна.Я использую 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-запрос.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

До тех пор, пока 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"
      }
    }
  }
}
0 голосов
/ 22 сентября 2018

Возможно, вам понадобится 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 keyBookTable
- Author.bookID для primary key и Author.id для sort key из AuthorTable

enter image description here

Вам также необходимо прикрепить резольвер для Book.author, используя $ctx.source.id

enter image description here

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

getBook(title: "xx") {
  id
  title
  author {
    id
    name
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...