如何在graphQL中访问具有特定属性的所有元素?

时间:2018-08-15 17:54:56

标签: reactjs express graphql express-graphql

我在名为countryData.json的文件中有一些json数据,其结构如下:

{
"info":"success",
"stats":
[{
    "id":"1",
    "name":"USA",
    "type":"WEST"
 },
 //...

我正在使用graphQL访问此数据。我已经使用以下方法在国家/地区架构中创建了对象类型:

const CountryType = new GraphQLObjectType({
    name: "Country",
    fields: () => ({
        id: { type: GraphQLID },
        name: { type: GraphQLString },
        type: { type: GraphQLString },
    })
});

我想编写一个查询,使我可以访问此数组中具有某个“名称”值的所有元素(可以有多个具有相同名称的值)。我编写了以下查询,但是它只返回数组中的第一个匹配项:

const RootQuery = new GraphQLObjectType({
    name:"RootQueryType",
    fields:{
        country: {
            type: CountryType,
            args: { type: { name: GraphQLString } },
            resolve(parent, args){
                return _.find(countryData.stats, {name: args.name});
            }
        }
    }
});

“ _”来自const _ = require('lodash');

此外,我如何才能获取数组中的每个项目?

1 个答案:

答案 0 :(得分:1)

我还没有重新创建代码,因此无法检查它是否可以正确执行。这是代码,我认为应该起作用(无需尝试)。如果要返回元素数组,则需要实现https://lodash.com/docs/#filter。过滤器将从统计信息中返回与参数名称匹配的所有对象。这将在解析程序函数中正确返回,但是,您的架构需要进行调整才能返回国家/地区数组。

  1. 您可能需要按如下所示重写参数,因为这可能不正确。您可以查看如何定义查询或变异参数https://github.com/atherosai/express-graphql-demo/blob/feature/2-json-as-an-argument-for-graphql-mutations-and-queries/server/graphql/users/userMutations.js。我将其重写为如下所示,以使用参数“ name”

    args:{名称:{类型:GraphQLString}}

  2. 您需要添加GraphQLList修饰符,该修饰符定义要从此查询返回CountryTypes数组。正确的代码应如下所示

    const RootQuery = new GraphQLObjectType({
      name:"RootQueryType",
      fields:{
        country: {
            type: CountryType,
            args: { name: { type: GraphQLString } },
            resolve(parent, args){
                return _.find(countryData.stats, {name: args.name});
            }
        },
        countries: {
            type: new GraphQLList(CountryType),
            args: { name: { type: GraphQLString } },
            resolve(parent, args){
                return _.filter(countryData.stats, {name: args.name});
            }
        }
      }
    });
    

现在,如果您致电查询国家/地区,则应该能够检索到期望的内容。希望对您有所帮助。如果您需要进一步的说明,我写了一篇关于在GraphQL模式中实现列表/数组的文章,因为我看到很多人都在为类似的问题而苦恼。您可以在这里https://graphqlmastery.com/blog/graphql-list-how-to-use-arrays-in-graphql-schema

进行检查

编辑:关于“如何检索每个对象”的问题。您可以通过某种方式修改解析程序功能中的代码,如果未指定name参数,则根本不会过滤国家/地区。这样,您可以在单个查询“国家”中同时拥有这两种情况。