如何为自引用数据层次结构创建graphql模式?

如何为自引用数据层次结构创建graphql模式?,graphql,relayjs,Graphql,Relayjs,这不起作用,因为类型在routes字段定义中引用了其自身: var routeType = new GraphQLObjectType({ name: 'MessageRoute', fields: { name: { type: GraphQLString }, routes: { type: new GraphQLList(routeType), resolve: (route) => { retu

这不起作用,因为类型在routes字段定义中引用了其自身:

  var routeType = new GraphQLObjectType({
  name: 'MessageRoute',
  fields: {
    name: {
      type: GraphQLString
    },
    routes: {
      type: new GraphQLList(routeType),
      resolve: (route) => {
        return route.routes;
      }
    }
  }
});

那么我该怎么做呢?

通过将
字段定义为返回对象而不是对象的函数,GraphQL类型可以引用自身(或引用文件中稍后定义的另一种类型)。该函数将在页面完全解析后调用

例如:

var routeType=新的GraphQLObjectType({
名称:“MessageRoute”,
字段:函数(){
返回{
姓名:{
类型:GraphQLString
},
路线:{
类型:新GraphQList(routeType),
解析:(路由)=>{
返回路线;
}
}
};
}
});
或者,如果您使用的是ES6,那么使用箭头函数可以很好地简化此操作:

var routeType=新的GraphQLObjectType({
名称:“MessageRoute”,
字段:()=>({
姓名:{
类型:GraphQLString
},
路线:{
类型:新GraphQList(routeType),
解析:(路由)=>{
返回路线;
}
}
})
});

我想指出,您可以使用函数为对象中的任何属性使用函数

因此,不必将整个
字段
属性包装在一个函数中,您可以将函数仅用于
类型
属性,如下所示:

var routeType = new GraphQLObjectType({
  name: 'MessageRoute',
  fields: {
    name: {
      type: GraphQLString
    },
    routes: {
      get type() {
         return new GraphQLList(routeType)
      },
      resolve: (route) => {
        return route.routes;
      }
    }
  }
});

很酷,谢谢,你知道我如何在不导致堆栈溢出的情况下编写react端吗?有没有办法让graphql查询的结果成为自引用的?我知道这在XML中是可能的——目前我对GraphQL有相当基本的了解。graphql引擎是否可能解析XML而不是JSON?