首页 > 解决方案 > 当参数是输入类型时,如何查询 GraphQL 架构?

问题描述

我对如何查询以下 GraphQL 模式感到有些困惑。我正在尝试查询宠物小精灵以提取搜索结果,但事实是 PokemonQueryInput! 在参数和 PokemonConnection! 中调用!结果让我很困惑。如何正确添加过滤器作为参数?以及如何正确使用 PokemonConnection?


架构.graphql

    type Query {
        pokemons(query: PokemonsQueryInput!): PokemonConnection!
        pokemonByName(name: String!): Pokemon
        pokemonById(id: ID!): Pokemon
        pokemonTypes: [String!]!
    }

    input PokemonsQueryInput {
        limit: Int = 10
        offset: Int = 0
        search: String
        filter: PokemonFilterInput
    }

    input PokemonFilterInput {
        type: String
        isFavorite: Boolean
    }

    type PokemonConnection {
        limit: Int!
        offset: Int!
        count: Int!
        edges: [Pokemon!]!
    }

    type Pokemon {
        id: ID!
        number: Int!
        name: String!
        ...
    }

index.js

pokemons: (__, args) => {
      const { limit, offset, search, filter } = args.query;
      let pokemons = pokemonsData;

      if (search) {
        const regex = new RegExp(search, 'i');
        pokemons = _.filter(pokemons, p => p.name.match(regex));
      }

      if (filter) {
        if (filter.type) {
          const regex = new RegExp(filter.type, 'i');
          pokemons = _.filter(pokemons,p => _.some(p.types, t => t.match(regex)));
        }

        if (filter.isFavorite) {
          pokemons = _.filter(pokemons, p => !!favorites.get(p.id));
        }
      }

      const count = pokemons.length;
      const edges = pokemons.slice(offset, offset + limit);

      return {
        limit,
        offset,
        count,
        edges
      }
    },

标签: graphql

解决方案


我通过关于对象类型的 GraphQL 文档找到了如何执行此操作的解决方案:https ://graphql.org/graphql-js/object-types/ 。类型可以通过嵌套在 { } 中来声明为参数。

{
  pokemons(query: {filter: {type: "Water"}}) {
    edges {
      name
    }
  }
}

推荐阅读