GraphQL-返回null的关系
我开始学习GraphQL,并尝试创建以下关系:GraphQL-返回null的关系,graphql,graphql-js,Graphql,Graphql Js,我开始学习GraphQL,并尝试创建以下关系: type User { id: ID!, name: String!, favoriteFoods: [Food] } type Food { id: ID! name: String! recipe: String } 所以基本上,一个用户可以有很多喜欢的食物,而一种食物可以是很多用户的最爱。我正在使用graphql.js,下面是我的代码: const Person=new GraphQLObjectType({ 姓名
type User {
id: ID!,
name: String!,
favoriteFoods: [Food]
}
type Food {
id: ID!
name: String!
recipe: String
}
所以基本上,一个用户可以有很多喜欢的食物,而一种食物可以是很多用户的最爱。我正在使用graphql.js,下面是我的代码:
const Person=new GraphQLObjectType({
姓名:'人',
description:'表示人员类型',
字段:()=>({
id:{type:GraphQLNonNull(GraphQLID)},
名称:{type:GraphQLNonNull(GraphQLString)},
favoriteFoods:{type:GraphQList(食品)},
})
})
const Food=新的GraphQLObjectType({
名称:'食品',
描述:“一个人最喜欢的食物”,
字段:()=>({
id:{type:GraphQLNonNull(GraphQLID)},
名称:{type:GraphQLNonNull(GraphQLString)},
配方:{type:GraphQLString}
})
})
以下是食品数据:
让foodData=[
{id:1,名字:'千层面',食谱:'做这个,然后把它放进烤箱',
{id:2,名字:'煎饼',食谱:'如果你停下来想一想,它只是一个薄而无味的蛋糕。},
{id:3,名字:'麦片',配方:'通用“我没心情做饭。”配方。},
{id:4,名字:'Hashbrowns',食谱:'只要一个土豆和一个油,你们就都准备好了。}
]
因为我只是尝试一下,我的解析器基本上只是返回一个在解析器内部创建的用户。我的想法是:将食物ID放入GraphQList中,然后使用lodash函数find()从foodData获取数据,并用找到的数据替换person.favoriteFoods中的值
const RootQuery=new-GraphQLObjectType({
名称:“RootQueryType”,
描述:'根查询',
字段:{
人:{
类型:人,,
解析(父级){
让人={
名字:“丹尼尔”,
喜欢的食物:[1,2,3]
}
foodIds=person.favoriteFoods
对于(变量i=0;i
但是最后的食物是空的。以下是查询的结果:
query {
person {
name
favoriteFoods {
name
recipe
}
}
}
# Returns
{
"data": {
"person": {
"name": "Daniel",
"favoriteFoods": [
{
"name": "Lasagna",
"recipe": "Do this then that then put it in the oven"
},
{
"name": "Pancakes",
"recipe": "If you stop to think about, it's just a thin, tasteless cake."
},
null
]
}
}
}
甚至可以只使用食物类型的ID从食物类型返回数据吗?或者我应该为此再问一个问题吗?在我看来,这种关系是有道理的,我不认为我需要在foodData中存储所有喜欢某种食物的用户的ID,因为它有一个ID,我可以用来获取数据,因此,我看不出代码或其结构有什么问题。在一个数组上调用
shift
和push
,同时在同一个数组中迭代,必然会导致一些意外的结果。您可以制作数组的副本,但只需使用map
:
const person = {
name: 'Daniel',
favoriteFoods: [1, 2, 3],
}
person.favoriteFoods = person.favoriteFoods.map(id => {
return foodData.find(food => food.id === id)
})
return person
这里的另一个问题是,如果您的模式在另一个解析器中返回一个Person
,那么您也必须在该解析器中复制此逻辑。您真正应该做的是将favoriteFoods:[1,2,3]
返回给此人。然后为favoriteFoods
字段编写一个单独的解析器:
resolve(person) {
return person.favoriteFoods.map(id => {
return foodData.find(food => food.id === id)
})
}
谢谢那么我的模式是有效的?或者你认为如果我在我的食物类型中创建一个名为userID的字段来存储所有喜欢某种食物的用户id会更好吗?