如何为自引用数据层次结构创建 graphql 模式?
How do i create a graphql schema for a self referencing data hierarchy?
这不起作用,因为该类型在路由字段定义中引用了它自己:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: {
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
}
});
那我该怎么做呢?
GraphQL 类型可以通过将 fields
定义为 returns 对象而不是对象的函数来引用自身(或引用稍后在文件中定义的另一种类型)。该函数将在页面完全解析后调用。
以你的例子为例:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: function () {
return {
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
};
}
});
或者,如果您使用的是 ES6,那么使用箭头函数可以很好地 shorthand:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: () => ({
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
})
});
我想指出的是,您可以使用 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;
}
}
}
});
这不起作用,因为该类型在路由字段定义中引用了它自己:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: {
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
}
});
那我该怎么做呢?
GraphQL 类型可以通过将 fields
定义为 returns 对象而不是对象的函数来引用自身(或引用稍后在文件中定义的另一种类型)。该函数将在页面完全解析后调用。
以你的例子为例:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: function () {
return {
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
};
}
});
或者,如果您使用的是 ES6,那么使用箭头函数可以很好地 shorthand:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: () => ({
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
})
});
我想指出的是,您可以使用 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;
}
}
}
});