使用 Apollo 批量递归查询(graphql)

Posted

技术标签:

【中文标题】使用 Apollo 批量递归查询(graphql)【英文标题】:Recursive queries in a batch with Apollo (graphql) 【发布时间】:2017-08-25 12:40:27 【问题描述】:

Facebook 标榜在打开 graphql 时提交递归查询的能力,我正在努力寻找能够让您高效(联网)且轻松地执行此操作的文档。

确切地说,我希望 query child (name) > name child (curName) [ name child ...] 可能直到我用尽整个树而不在查询本身中输入任意数量的分支(如果可能)。

【问题讨论】:

【参考方案1】:

字段解析器实际上解决了它。 graphql server 中的查询基本上有两种,一种是根查询解析器,一种是字段解析器。在 apollo 中看下面的例子,但是背后的思路是一样的:

type Person 
   name: String
   friends: [Person]


type Query 
    allPeople($name: String):[Person]


schema 
    query: Query

基于上面的 typedef,你可以编写一个根查询解析器,如下所示:


    Query: 
        allPeople: (root, args) => PersonModel.find(where: name: args.name)
    

您还需要为friends 字段编写解析器,如下所示:


    Person: 
        friends: (root, args) => PersonModel.find(where: friendId: root.id)  
    

由于字段解析器,它可以无限嵌套。

顺便说一句,为了避免太多的sql语句打到db,我们可以引入dataloader包,它来自facebook,它可以将一个异步链中的所有查询组合成我们在初始化dataloader时提供的一个批处理查询。

上面的代码是一种伪代码,希望它解释清楚。

干杯, 罗恩

【讨论】:

你从哪里读到关于 root 参数的,因为 apollo 文档很奇怪,而 graphql 是故事的一半? 如果是字段解析器,则根为字段所属的对象。如果是根查询解析器,就是用户传入的值,详情请查看dev.apollodata.com/tools/graphql-server/…。

以上是关于使用 Apollo 批量递归查询(graphql)的主要内容,如果未能解决你的问题,请参考以下文章

React Native:为啥使用 Apollo 的 GraphQL 查询返回未定义?

通过 Apollo 进行 GraphQL 查询

Apollo/Graphql,Postgres - 为啥这个查询返回 null? [复制]

如何使用 apollo / graphql 实现节点查询解析器

如何使用 react-apollo 使用相同的查询进行多个 graphql 查询?

如何使用 apollo 服务器从变量运行 graphql 查询