Параметр args
заполняется аргументами, передаваемыми разрешаемому полю - любые аргументы, передаваемые в другие поля, не будут включены в параметр args
.
Ваша схема содержит один аргумент (title
) в поле book
вашего типа Query
. Это означает, что распознаватель для этого поля получит аргумент title
как часть своего параметра args
, но только если этот аргумент фактически включен в ваш запрос:
// Request
query {
book(title: "Something") {
title
}
}
// Resolvers
const resolvers = {
Query: {
book: (root, args) => {
console.log(args) // {title: 'Something'}
}
},
}
В отличие от:
// Request
query {
book {
title
}
}
// Resolvers
const resolvers = {
Query: {
book: (root, args) => {
console.log(args) // {}
}
},
}
Если вы передадите значение для аргумента title
, единственный способ получить это значение в резольверах для других полей - это проанализировать параметр info
. Вы бы не смотрели на свойство variableValues
, потому что значение, передаваемое аргументу, может быть литеральным значением или переменной. Вам нужно пройти через массив fieldNodes
и найти вместо него соответствующее значение аргумента.
Однако, как правило, нет необходимости проходить через все это.
Если предполагается, что поле book
просто возвращает объект книги, ваша логика выбора правильной книги из массива books
должна быть включена в преобразователь этого поля:
const resolvers = {
Query: {
book: (root, args) => {
return books.find(book => book.title === args.title)
}
},
}
Нет смысла включать распознаватель для поля title
в типе Book
, если только это поле не требуется для разрешения чего-либо, отличного от того, к которому оно будет разрешено по умолчанию (свойство title
в объект, возвращаемый распознавателем родительского поля). Этого будет достаточно для запроса всех книг и отдельной книги по названию:
const resolvers = {
Query: {
book: (root, args) => {
return books.find(book => book.title === args.title)
},
books: () => books,
},
}
Обратитесь к официальному учебнику от Apollo, чтобы получить больше примеров и полное объяснение работы распознавателей.