Поля GraphQL никогда не разрешаются, если они явно не запрошены.
Давайте рассмотрим более сложный пример. Допустим, у нас есть эта схема:
type Query {
getUser: User
}
type User {
firstName: String
lastName: String
fullName: String
}
И наши распознаватели выглядят так:
const resolvers = {
Query: {
getUser: () => ({ firstName: 'Susan', lastName: 'Martinez' }),
},
User: {
fullName: (user) => `${user.first_name,} ${user.last_name,}`,
},
}
Мы возвращаем пользовательский объект в нашем getUser
распознавателе. Мы полагаемся на поведение распознавателя по умолчанию для полей firstName
и lastName
, но предоставляем собственный распознаватель для fullName
. Если мы сделаем этот запрос:
query {
getUser {
firstName
}
}
, то будут вызваны только два резольвера - один для getUser
и один для firstName
. Однако этот запрос
query {
getUser {
firstName
fullName
}
}
также вызовет преобразователь fullName
. Каждый распознаватель имеет доступ к любому значению, к которому разрешено родительское поле. Поэтому, если определение fullName
стоит дорого, вы можете переместить логику для оценки этого значения в распознаватель поля.
С другой стороны, если вам просто нужно знать, какие дочерние поля были запрошены, на это уже есть ответ .