GraphQL Schema处理混合类型

时间:2015-12-11 21:37:23

标签: graphql graphql-js

我最近开始研究使用GraphQL来请求动态数据配置的可能性。跳出来的第一件事是强大的GraphQL概念。

GraphQL模式是否有办法处理混合类型对象的数组?我非常感谢我可以阅读的解释或可能的参考。

我目前正在使用带有Node.js的GraphQL,但稍后的实现将来自Java容器。所有数据都将从MongoDB中获取JSON。

3 个答案:

答案 0 :(得分:2)

您必须使这些不同类型实现相同的接口,使解析器返回联合,或创建自定义标量来保存动态数据。

最简洁的方法是第一种方法:如果生成的对象可以是有限数量的类型,则定义类型以便它们实现相同的接口,并通过接口键入解析器。这允许客户端根据实际类型有条件地选择子字段,并保持类型安全。

第二种方法有类似的限制:您需要提前知道可能的类型,但它们不必实现相同的接口。当可能的值彼此无关并且具有或/或语义(例如成功/失败)时,它是可取的。

自定义标量方法是唯一一种不需要知道结果的可能类型的方法,即结果的结构可以是完全动态的。该方法的Here's an implementation,称为JSON标量(即将任何JSON可序列化结构塞入标量值)。这种方法的一大缺点是它使得子选择不可能,因为整个值变成一个大标量(即使它是一个复杂的对象)。

答案 1 :(得分:0)

我认为可以制作符合需求的自定义/通用类型。 因此,它仍然是一个强类型数组,但类型将足够灵活,可以设置你需要的数据。

以下是自定义类型的示例: https://github.com/stylesuxx/graphql-custom-types

答案 2 :(得分:0)

如果数据完全是JSON,而您宁愿保留它们,请签出JSON scalar type。基本上,

import { GraphQLObjectType } from 'graphql';
import GraphQLJSON from 'graphql-type-json';

export default new GraphQLObjectType({
  name: 'MyType',
  fields: {
    myField: { type: GraphQLJSON },
  },
});