Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GraphQL-返回null的关系_Graphql_Graphql Js - Fatal编程技术网

GraphQL-返回null的关系

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({ 姓名

我开始学习GraphQL,并尝试创建以下关系:

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会更好吗?