2017-10-13 90 views
1

我很好奇如何最好地构建apollo-server的GraphQL解析器,以利用API的能力来选择性地解析外键(类似于JSON API的includes)。例如,您可以要求评论被包括在一个帖子中添加参数:如何在一个GraphQL解析器中使用JSON API?

GET /articles/1?include=comments HTTP/1.1 

然而,对于结果的要求在articles解析器的水平作出。它可以以某种方式访问​​它下面的字段?某种程度上,comments解析程序能否影响其父项?

我在graphql.org上看到有a blog post,它引用了一个pull request,它被设计用来解决这个问题...这个问题已经被作者放弃了。我可以采取哪些其他方法?这基本上是当前规范的限制吗?在地平线上还有其他变化可能会有帮助吗?

回答

1

这是一个有趣的用例:)

您的查询以自上而下的方式解决,因此对于articles解析器的解析器为comments之前称为 - 有办法的任何事情,你comments解析器里面做可能会影响解析器所做的工作。但是,每个解析器都传递了四个参数 - (1)由其父字段解析的对象,(2)其字段上的参数,(3)上下文和(4)GraphQLResolveInfo对象。最后一个包含有关提交给服务器的查询的信息。

例如,假设你有这样的查询:

query ArticlesQuery { 
    articles { 
    comments { 
     text 
    } 
    } 
} 

的信息对象会是这个样子:

{ 
    "fieldNodes": [ 
    "name": { 
     "value": "articles" 
    }, 
    selectionSet: [ 
     "name": { 
     "value": "comments" 
     }, 
     selectionSet: [ 
     "name": { 
      "value": "text" 
     } 
     ] 
    ] 
    [ 
} 

我省略了一些其他领域,但你可以看到对象是如何嵌套的,就像查询文档一样。这可以遍历它来检查实际请求的字段。然后您可以适当地修改您的API调用。

还有那里的工具,like this one,可以帮助你更容易地解析对象。