Повторное использование набора аргументов в GraphQL - PullRequest
0 голосов
/ 26 января 2019

У меня есть набор общих фильтров, которые являются аргументами для разных типов моего API GraphQL.

Я хотел бы иметь возможность объявлять аргументы и их типы один раз и повторно использовать эту логику, а не добавлять ее в каждый запрос.

Просто интересно, как лучше всего достичь этого? Удовлетворяет ли спецификация graphql этому варианту использования или я могу просто объявить набор параметров в виде строки и добавить его в запросы? Что-то вроде:

let filterArgs = "timeStart: $startTime, timeEnd:$endTime, someFilter: $someFilter" let filterTypes = "$startTime, DateTime!, $endTime: DateTime, $someFilter: String!"

const SOME_QUERY = gql`
  query someQuery(${filterTypes}, $specificType: Int!) {
    someFilterableType(${filterArgs}) {
      someField
    }
    anotherFilterableType(${filterArgs}, additionalArg: $specificType)
  }
`;

Приветствия

1 Ответ

0 голосов
/ 26 января 2019

На самом деле вы не можете многое сделать на стороне клиента. Это действительно больше проблем с дизайном схемы. Часто имеет смысл преобразовать несколько аргументов в поле в один тип входного объекта. Это имеет еще больший смысл, когда одни и те же аргументы дублируются в нескольких полях вашей схемы. Сравнить

type Query {
  foo(baz: String, qux: String, quuz: String, corge: String, grault: String, garply: String, waldo: String, fred: String, plugh: String, xyzzy: String): Int!
  bar(baz: String, qux: String, quuz: String, corge: String, grault: String, garply: String, waldo: String, fred: String, plugh: String, xyzzy: String): Int!
}

с

type Query {
  foo(input: FilterInput): Int!
  bar(input: FilterInput): Int!
}

input FilterInput {
  baz: String
  qux: String
  quuz: String
  corge: String
  grault: String
  garply: String
  waldo: String
  fred: String
  plugh: String
  xyzzy: String
}

Сокращение всех этих общих аргументов в отдельный тип не только уменьшает дублирование в вашей схеме, но и упрощает запрос клиента:

query SomeQuery($input: FilterInput) {
  foo(input: $input)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...