这不起作用,因为类型在路径字段定义中引用其自身:
var routeType = new GraphQLObjectType({
name: 'MessageRoute',
fields: {
name: {
type: GraphQLString
},
routes: {
type: new GraphQLList(routeType),
resolve: (route) => {
return route.routes;
}
}
}
});
所以我该怎么做?
答案 0 :(得分:15)
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;
}
}
})
});
答案 1 :(得分:1)
我想指出您可以使用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;
}
}
}
});