GraphQL查询,带有动态字段

时间:2019-10-01 00:22:26

标签: graphql apollo

我有这样的架构类型:

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

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

2 个答案:

答案 0 :(得分:1)

您可以在字段上包含一个path参数,然后使用lodash的{​​{1}}之类的东西根据提供的路径来转换JSON项:

get

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

伙计们常常觉得他们需要使用JSON标量只是因为他们正在使用的数据是一张地图。但是,地图可以轻松转换为数组,而无需JSON标量就可以轻松地在您的模式中表示它。所以你可以打开它:

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

对此:

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

答案 1 :(得分:0)

您可以在tags中添加参数,例如路径或其他某种过滤器:

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

然后在解析器中实现过滤器,例如@Daniel Rearden的答案

但是!为什么要使用巨大的json设计它??

通常,当事物很少且在编译时无法确定数据的“形状”时,我会使用JSON。或者仅仅是服务器不在乎数据内容,客户端将完成所有工作。

在您的情况下,JSON数据确实很大,所以我想将其分解为较小的类型会是一种更好的方法