如何为自引用数据层次结构创建 graphql 模式?
Posted
技术标签:
【中文标题】如何为自引用数据层次结构创建 graphql 模式?【英文标题】:How do i create a graphql schema for a self referencing data hierarchy? 【发布时间】:2015-12-09 15:23:40 【问题描述】:这不起作用,因为类型在路由字段定义中引用其自身:
var routeType = new GraphQLObjectType(
name: 'MessageRoute',
fields:
name:
type: GraphQLString
,
routes:
type: new GraphQLList(routeType),
resolve: (route) =>
return route.routes;
);
那我该怎么做呢?
【问题讨论】:
【参考方案1】:GraphQL 类型可以通过将fields
定义为返回对象而不是对象的函数来引用自身(或引用文件中稍后定义的另一种类型)。该函数将在页面完全解析后调用。
你的例子:
var routeType = new GraphQLObjectType(
name: 'MessageRoute',
fields: function ()
return
name:
type: GraphQLString
,
routes:
type: new GraphQLList(routeType),
resolve: (route) =>
return route.routes;
;
);
或者,如果您使用的是 ES6,那么使用箭头函数的一个很好的简写:
var routeType = new GraphQLObjectType(
name: 'MessageRoute',
fields: () => (
name:
type: GraphQLString
,
routes:
type: new GraphQLList(routeType),
resolve: (route) =>
return route.routes;
)
);
【讨论】:
很酷,谢谢,知道我如何编写反应方面的东西而不会导致堆栈溢出吗? 有没有办法让 graphql 查询的结果自引用?我知道这在 XML 中是可能的——此时我对 GraphQL 有相当基本的了解。 graphql引擎是否有可能解析XML而不是JSON?【参考方案2】:我想指出的是,您可以使用 javascript getter 为对象内的任何属性使用函数。
因此,除了将整个 fields
属性包装在一个函数中之外,您还可以将一个函数仅用于 type
属性,如下所示:
var routeType = new GraphQLObjectType(
name: 'MessageRoute',
fields:
name:
type: GraphQLString
,
routes:
get type()
return new GraphQLList(routeType)
,
resolve: (route) =>
return route.routes;
);
【讨论】:
以上是关于如何为自引用数据层次结构创建 graphql 模式?的主要内容,如果未能解决你的问题,请参考以下文章
如何为graphql类型的字段对象添加排序,引用不同的graphql类型?