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





Возможно, вам понадобится 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"
}
}
}
}
Функции распознавателя - это код, и, по сути, все возможно. Совершение двух вызовов и изменение формы данных в соответствии с форматом API, который вы планируете раскрыть, кажется очень разумным.