如何在GraphQL解析器中使用JSON API包含?

时间:2017-10-13 21:25:28

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这是一个有趣的用例:)

您的查询以自上而下的方式解决,因此在articles的解析器之前调用comments的解析器 - 您在comments解析器内无法做任何事情可以影响articles解析器的功能。

但是,每个解析器都传递四个参数 - (1)通过其父字段解析的对象,(2)其字段上的参数,(3)上下文和(4)GraphQLResolveInfo对象。最后一个包含有关提交给您的服务器的查询的信息。

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

query ArticlesQuery {
  articles {
    comments {
      text
    }
  }
}

info对象看起来像这样:

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

我省略了许多其他字段,但您可以像查询文档一样查看对象的嵌套方式。这使得可以迭代它以检查实际请求的字段。然后,您可以相应地修改API调用。

还有一些工具,like this one,可以帮助您更轻松地解析对象。