【问题标题】:How to conditionally include a filtering argument in a GraphQL query?如何有条件地在 GraphQL 查询中包含过滤参数?
【发布时间】:2021-02-18 03:30:47
【问题描述】:

我有以下 GraphQL 查询(使用 Apollo Client JS):

query GetUsers($searchFilter: String) {
    users(
        first: 10,
        filter: { search: $searchFilter }
    ) {
        nodes {
            id
            name
        }
    }
}

当我传入 $searchFilter 参数时,这很有效。但是,我希望这个$searchFilter 参数是可选的。所以当它是null 时,它不会应用过滤器。

这看起来很简单,但 API 要求 search 不可为空。所以不允许传入filter: { search: null }

我想实现以下目标:

query GetUsers($searchFilter: String) {
    users(
        first: 10,
        filter: $searchFilter = null ? null : { search: $searchFilter }
    ) {
        nodes {
            id
            name
        }
    }
}

如何有条件地包含 filter 参数?

【问题讨论】:

  • 只为filter 变量传递(整个“早先编写/准备”)值(未定义)...在graphql 中不允许逻辑(没有指令,恕我直言,在这种情况下不适合)
  • @xadm 的语法是什么?
  • 从 server/api [此突变] 规范中读取 filter arg 类型,传递对象
  • query GetUsers($filter: SomeFilterInputType) { users( first: 10, filter: $filter ) {...,通过filter: { search: 'sth'}
  • @xadm 这行得通,谢谢!如果你把它放在一个答案中,我会接受它

标签: javascript graphql apollo


【解决方案1】:

只需为filter(在查询时定义)变量传递(整个“早先编写/准备”)值。未定义此变量使其成为可选的。

query GetUsers($filter: SomeFilterInputType) {
  users(
    first: 10, 
    filter: $filter ) {

在 [query] 变量中传递 filter 的值:

{
  filter: { search: 'sth'}
}

... 其中SomeFilterInputType 是 [users 查询] arg 类型名称,它可以从 API 规范中读取,在 graphiql/playground 文档中可用...或服务器代码/类型定义强>

可以使用 QUERY VARIABLES 在 graphiql/playground 中进行测试。

从 JavaScript 传递的variables 是一个具有相同结构的对象,很容易有条件地创建/修改。

在这种情况下,SomeFilterInputType(类型名称后没有 ! 标记)意味着它(filter 变量)可以为空/未定义 - 通常可选参数可以为空(不是必需的)。如果 API/BE 规范中需要一些 arg,那么客户端也必须需要它。

【讨论】:

  • 这对我帮助很大,谢谢。不知道! 把它变成了一个不可为空的值。
猜你喜欢
  • 1970-01-01
  • 2019-01-08
  • 2021-06-06
  • 1970-01-01
  • 2019-05-05
  • 2018-04-14
  • 2021-03-10
  • 2019-02-10
  • 2019-09-12
相关资源
最近更新 更多