带有动态字段的 GraphQL 查询

GraphQL query, with dynamic fields

我有这样的架构类型:

type Instance {
  id: ID!
  parentSeries: ID
  tags: JSON
}

标签字段是动态 JSON 类型 (https://github.com/taion/graphql-type-json)。它也非常大。理想情况下,在客户端,我可以使用标签 I return 指定哪些字段。 GraphQL/Apollo 这可能吗?如果没有,您有什么建议?

您可以在字段中包含一个 path 参数,然后使用 lodashget 之类的东西根据提供的路径转换 JSON 项目:

const resolvers = {
  Instance: {
    tags: (instance, args) => {
      return _.get(instance.tags, args.path)
    },
  },
}

您可以通过这种方式应用任意数量的任意转换来自定义返回的 JSON 对象。但是,由于您返回的是标量,因此无法只为该字段提供一个选择集。

人们经常觉得他们 需要 使用 JSON 标量只是因为他们正在使用的数据是地图。但是,地图可以轻松转换为数组,无需 JSON 标量即可轻松在您的架构中表示。所以你可以把这个:

{
  "foo": {
    "propA": "A",
    "propA": "B"
  },
  "bar": {
    "propA": "A"
    "propA": "B"
  }
}

进入这个:

[
  {
    "tagName": "foo",
    "propA": "A",
    "propA": "B"
  },
  {
    "tagName": "bar",
    "propA": "A",
    "propA": "B"
  }
]

您可以在 tags 中添加参数,如路径或其他类型的过滤器:

type Instance {
  id: ID!
  parentSeries: ID
  tags(path:String): JSON
}

然后像@Daniel Rearden 的回答一样在解析器中实现过滤器

然而!为什么要设计这么大json???

通常我用JSON当只有少量的东西并且"shape"的数据在编译时无法确定。或者只是服务器不关心数据的内容,客户端将完成所有工作。

在你的情况下,JSON 数据确实很大,那么我想将其分解为更小的类型会是更好的方法