我在名为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');
此外,我如何才能获取数组中的每个项目?
答案 0 :(得分:1)
我还没有重新创建代码,因此无法检查它是否可以正确执行。这是代码,我认为应该起作用(无需尝试)。如果要返回元素数组,则需要实现https://lodash.com/docs/#filter。过滤器将从统计信息中返回与参数名称匹配的所有对象。这将在解析程序函数中正确返回,但是,您的架构需要进行调整才能返回国家/地区数组。
您可能需要按如下所示重写参数,因为这可能不正确。您可以查看如何定义查询或变异参数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}}
您需要添加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参数,则根本不会过滤国家/地区。这样,您可以在单个查询“国家”中同时拥有这两种情况。