首页 > 解决方案 > 如何有条件地在 GraphQL 查询中包含过滤参数?

问题描述

我有以下 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论点?

标签: javascriptgraphqlapollo

解决方案


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

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

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

{
  filter: { search: 'sth'}
}

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

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

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

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


推荐阅读