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

问题描述:

这行不通,因为类型是指其在路线字段定义自我:如何为自引用数据层次创建graphql模式?

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

让我怎么办呢?

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

对于示例:

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; 
     } 
    } 
    }) 
}); 
+0

酷感谢,任何想法,我怎么写的东西作出反应方面没有得到一个堆栈溢出? – SammoSampson

我想指出的是,你可以使用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; 
     } 
    } 
    } 
});