首页 > 解决方案 > GraphQL 查询,具有动态字段

问题描述

我有这样的模式类型:

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

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

标签: graphqlapollo

解决方案


您可以path在字段中包含一个参数,然后使用类似lodash's的内容get根据提供的路径转换 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"
  }
]

推荐阅读