0

我在名为 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');

另外,我怎样才能得到数组中的每一个项目?

4

1 回答 1

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-查询/服务器/graphql/users/userMutations.js。我将其重写如下以具有参数“名称”

    参数:{名称:{类型: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

编辑:至于“如何检索每个对象”的问题。您可以修改解析器函数中的代码,如果未指定名称参数,则根本不会过滤国家/地区。这样,您可以在单个查询“国家”中同时处理这两种情况。

于 2018-08-15T19:54:45.240 回答