GraphQL 解析器为具有关系的对象返回啥?

Posted

技术标签:

【中文标题】GraphQL 解析器为具有关系的对象返回啥?【英文标题】:What does a GraphQL resolver return for an object with a relation?GraphQL 解析器为具有关系的对象返回什么? 【发布时间】:2018-11-25 17:57:42 【问题描述】:

如果我有

type Post 
  title: String!
  body: String!
  author: User!

type User 
  name: String
  posts: [Post!]!

type Query 
  users: [User!]!

解析器users 返回什么?我知道它可以返回一个空列表,但是当它返回一个填充列表时,我不确定如何处理它。直观地说,在我看来它应该是无限的,因为用户包含他们的帖子列表,每个帖子都包含用户等。显然情况并非如此,那么解析器 做什么Query.users返回?

【问题讨论】:

【参考方案1】:

解析器只返回你让它返回的东西。它不是根据类型自动生成的。它的作用是:它根据您解析的对象匹配对象的类型。

在这种情况下,您的解析器将返回一个用户列表,每个用户都有一个名称和一个帖子列表,每个帖子都有一个标题、正文和作者。

是的,它似乎可以创建无限的数据流,但这正是graph 背后的想法,即所有数据都与其关系相连,反之亦然。

你可以想象返回数据是这样的:

data: 
        users: [
            
                name: "user 1",
                posts: [
                    
                        title: "post 1",
                        body: "post body",
                        author: 
                            name: "user 1",
                            posts: [
                                
                                    title: "post 1",
                                    body: "post body",
                                    author: 
                                        name: "user 1",
                                        posts: [
                                            
                                                .....
                                            
                                        ]
                                    
                                
                            ]
                        
                    
                ]
            ,
            
                name: "user 2",
                posts: [
                    
                        title: "post 2",
                        body: "post body",
                        author: 
                            name: "user 2",
                            posts: [
                                
                                    title: "post 2",
                                    body: "post body",
                                    author: 
                                        name: "user 2",
                                        posts: [
                                            
                                                .....
                                            
                                        ]
                                    
                                
                            ]
                        
                    
                ]
            
        ]
    

同样,GraphQL 只返回您要求它返回的数据。因此,如果您只想要用户和帖子,则查询将类似于:

query getUsers 
  users 
    name
    posts 
      title
      body
    
  

在这种情况下,它只会返回用户及其帖子,而不是作者。

【讨论】:

谢谢。现在这很有意义,因为我回顾文档并看到在示例中,总是将 info 参数传递给 ORM。

以上是关于GraphQL 解析器为具有关系的对象返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 eslint 从 graphql 解析器返回啥严格的打字稿类型?

NodeJs 中的 GraphQl - 对象类型的解析器

用于可迭代对象的 Java GraphQL 解析器:休眠异常

解析器必须是对象或函数(Graphql 关系)

具有父子关系的 2 个实体的 GraphQL 突变返回第二个实体的旧值

Meteor Apollo GraphQL 接口:返回一个对象数组并在另一个解析器中调用解析器