Динамическая загрузка полей

Я использую библиотеку graphql-express для создания небольшого доказательства концепции сервера GraphQL. Предположим, что эта схема:

const typeDef = `
    type Book {
         id: ID!
         title: String
         author: Author
         likes: Int
    }

    type Author {
         id: String
         name: String
         age: Int
         books: [Book]
    }

    type Query{
         book(id: ID!): Book
    }

Это означает, что я смогу получить книгу по идентификатору, а клиент может выбрать, какие поля будут переданы. Предположим, что загрузка автора является дорогостоящим дополнительным вызовом для отдыха на стороне сервера. Поэтому, если клиент не запрашивает автора, я не хочу, чтобы функция распознавателя загружала автора. Может ли кто-нибудь привести пример функции распознавания книг, которая не работает, если она действительно должна загрузить автора и загружает его только по запросу?

Спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Преобразователи позволяют вам определять функции, которые будут выполняться только при запросе поля.

Таким образом, мы можем определить функцию для типа Book для автора и для типа Author для книг, давайте предположим, что поле автора содержит идентификатор автора, а книги содержат массив идентификаторов книг.

const resolvers = {
  Query: {
    // destruct id from args
    book: (root, { id }) => Book.getBookById(id),
  },
  // When we query for the Book type resolve the author field based on this function
  // if we dont query for the author field this function is not going to run
  // first argument is the parent document/record so we destruct author field
  // which will usually be the author id
  Book: {
    author: ({ author }) => Author.getAuthorById(author),
  },
  // Same as above when we request an Author type run this function
  // when books field is requested
  Author: {
    books: ({ books }) => Book.getBooksByIds(books),
  },
};

Большое спасибо, все простые примеры показывают, как создать схему, а используемые функции распознавателя - это привет, мир... Я смог создать свою схему, сшивая/связывая сами объекты, но искал этот более простой подход выше. Спасибо!

Sven Haiges 10.04.2019 09:29

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