2015-09-13 24 views
9

這行不通,因爲類型是指其在路線字段定義自我:如何爲自引用數據層次創建graphql模式?

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

讓我怎麼辦呢?

回答

13

通過將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

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; 
     } 
    } 
    } 
}); 
相關問題