Я использую библиотеку 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
}
Это означает, что я смогу получить книгу по идентификатору, а клиент может выбрать, какие поля будут переданы. Предположим, что загрузка автора является дорогостоящим дополнительным вызовом для отдыха на стороне сервера. Поэтому, если клиент не запрашивает автора, я не хочу, чтобы функция распознавателя загружала автора. Может ли кто-нибудь привести пример функции распознавания книг, которая не работает, если она действительно должна загрузить автора и загружает его только по запросу?
Спасибо!
Преобразователи позволяют вам определять функции, которые будут выполняться только при запросе поля.
Таким образом, мы можем определить функцию для типа 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),
},
};
Большое спасибо, все простые примеры показывают, как создать схему, а используемые функции распознавателя - это привет, мир... Я смог создать свою схему, сшивая/связывая сами объекты, но искал этот более простой подход выше. Спасибо!