重用GraphQL中的一组参数

时间:2019-01-26 01:17:08

标签: graphql

我有一组通用过滤器,它们是我的graphQL api的不同类型范围内的参数。

我希望能够一次声明参数及其类型,然后重用此逻辑,而不是将其添加到每个查询中。

只是想知道实现此目标的最佳方法是什么? 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 :(得分:1)

您可以做很多其他工作。这实际上是架构设计的一个问题。将字段上的多个参数转换为单个输入对象类型通常很有意义。当那些相同的参数在模式中的多个字段之间重复时,这更有意义。比较

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)
}