Передать параметр в запрос GraphQL легко. А как насчет фрагментов GraphQL?
Этот код содержит несколько совершенно нормальных запросов с параметром (itemId) и намеком на то, что я пытаюсь сделать (includeExtraResults):
export const GET_ITEM = gql`
query GetItem($itemId: ID!, $includeExtraResults:BOOLEAN) {
container {
item(itemId: $itemId) {
itemId
someField
innerItem(someExtraOption: $includeExtraResults) {
...InnerItemFragment
}
}
}
}
${INNER_ITEM_FRAGMENT}
`;
export const INNER_ITEM_FRAGMENT = gql`
fragment InnerItemFragment on InnerItemType {
innerItemId
innerInnerItem(someExtraOption: $includeExtraResults) {
someFields
}
}
${INNER_INNER_ITEM_FRAGMENT}
`;
export const INNER_INNER_ITEM_FRAGMENT = gql`
/* (not detailed here) */
`;
Когда внутренние внутренние элементы автоматически запрашиваются как часть внутренних элементов, я не хочу, чтобы они возвращали поле, на основе которого работает фильтр. Клиент тоже не знает логики. Вместо этого я хочу использовать параметр, и логика определяется на стороне сервера.
Тем не менее, их запрос реализован таким образом, что ему нужен (необязательный) параметр «includeExtraResults», который передается в GetItem в первую очередь.
Итак, есть ли способ передать «includeExtraResults» во внутренний фрагмент? Что нужно изменить, чтобы это имело смысл? В реальной жизни это сложная система с множеством уровней внутренних фрагментов.





Как указано в здесь, вы должны явно включить переменные фрагмента перед их использованием:
import { enableExperimentalFragmentVariables } from 'graphql-tag'
enableExperimentalFragmentVariables()
По крайней мере, это должно позволить вам использовать переменные, определенные в вашей операции, внутри включенных фрагментов. Обратите внимание, что это по-прежнему экспериментальная функция, которая официально не является частью спецификации — см. Эта проблема для текущего обсуждения.
@jeancallisti Вышеупомянутое должно работать с кодом в вашем вопросе. Никаких изменений, кроме включения этой функции, не требуется. Что непонятного в синтаксисе?
Хорошо, тогда, если он работает "как есть" и если includeExtraResults можно передать в innerInnerItem, тогда все в порядке. Интересно, как отреагирует компилятор, если я включу этот фрагмент в другой запрос, у которого нет параметра, но это для другого дня.
Я думаю, что graphql-tag все еще будет анализировать это, но вы определенно столкнетесь с ошибкой сервера, поскольку ваш запрос не пройдет проверку.
Это не то же самое, но все же связано:
Вы можете использовать переменные запроса внутри фрагментов:
query HeroComparison($first: Int = 3) {
leftComparison: hero(episode: EMPIRE) {
...comparisonFields
}
rightComparison: hero(episode: JEDI) {
...comparisonFields
}
}
fragment comparisonFields on Character {
name
friendsConnection(first: $first) {
totalCount
edges {
node {
name
}
}
}
}
Эта информация от официальное руководство
На самом деле я пытался добиться этого, поэтому я изменил «правильный ответ» на ваш ответ (после почти 3 лет, когда другой ответ был отмечен зеленой галочкой ;-p). Я не помню, почему я столкнулся с проблемами и что заставило меня поверить, что я не могу использовать глобальный параметр запроса во фрагменте. Возможно, я использовал некоторые автоматически сгенерированные обертки Typescript и/или какой-то инструмент проверки синтаксиса (Lint), которые бросали красные флажки по этому поводу. Или, может быть, я просто не был достаточно смелым, чтобы предположить, что это сработает.
Не могли бы вы добавить пример для демонстрации синтаксиса прямо здесь, в stackoverflow?