【问题标题】:How can I use JSON API includes in a GraphQL resolver?如何使用 GraphQL 解析器中包含的 JSON API?
【发布时间】:2018-03-26 01:57:07
【问题描述】:

我很好奇如何最好地为 apollo-server 构建我的 GraphQL 解析器,以利用 API 选择性地解析外键的能力(类似于 JSON API 的 includes)。例如,您可以通过添加参数来请求将 cmets 包含在帖子中:

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

但是,对记录的请求是在 articles 解析器级别发出的。它可以以某种方式访问​​它下面的字段吗? comments 解析器能否以某种方式影响其父级?

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

【问题讨论】:

    标签: graphql graphql-js json-api apollo-server


    【解决方案1】:

    这是一个有趣的用例:)

    您的查询是以自上而下的方式解决的,因此 articles 的解析器在 comments 的解析器之前被调用 - 您在 comments 解析器中所做的任何事情都不会影响 @987654325 @resolver 可以。

    但是,每个解析器都传递了四个参数——(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,可以帮助您更轻松地解析对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2019-06-19
      • 1970-01-01
      • 2017-07-10
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多