2017-02-27 236 views
0

我發現的所有例子都有一個query頂級對象,然後是一個查詢列表,然後返回類型更深的查詢。如何嵌套graphql查詢

因爲我有大量的查詢,我想他們組了,這是我的嘗試:

const AppType = new GraphQLObjectType({ 
    name: 'App', 
    description: 'Generic App Details', 

    fields:() => ({ 
     name: { type: GraphQLString }, 
     appId: { type: GraphQLInt }, 
    }), 
}); 

const MyFirstQuery = { 
    type: new GraphQLList(AppType), 
    args: { 
     appId: { type: GraphQLInt }, 
    }, 
    resolve: (root, args) => fetchApp(args.appId), 
};  

/* snip MySecondQuery, MyThirdQuery, MyFourthQuery */ 

const MyFirstGroupQuery = new GraphQLObjectType({ 
    name: 'myFirstGroup', 
    description: 'the first group of queries', 

    fields:() => ({ 
     myFirstQuery: MyFirstQuery, 
     mySecondQuery: MySecondQuery, 
     myThirdQuery: MyThirdQuery, 
     myFourthQuery: MyFourthQuery, 
    }), 
}); 

/* snip MySecondGroupQuery, MyThirdGroupQuery and their types */  

const QueryType = new GraphQLObjectType({ 
    name: 'query', 
    description: 'read-only query', 

    fields:() => ({ 
     myFirstGroup: MyFirstGroupQuery, 
     mySecondGroup: MySecondGroupQuery, 
     myThirdGroup: MyThirdGroupQuery, 
    }), 
}); 

const Schema = new GraphQLSchema({ 
    query: QueryType, 
}); 

爲什麼我不能讓MyFirstGroupQuery像我一樣QueryType,使多個嵌套層次?代碼工作正常,如果我把所有的查詢中QueryType,但我MyFirstGroupQuery產生錯誤:

Error: query.myFirstGroup field type must be Output Type but got: undefined. 

如何實現我想要什麼?我真的不想僅僅加上我的所有查詢的前綴。

+0

你的意思是像你這樣的聲明的'Quertype'在'GraphQLSchema' –

回答

1

錯誤query.myFirstGroup field type must be Output Type but got: undefined.意味着你沒有爲myFirstGroup 提供的類型可以選擇使用type字段

myFirstGroup: { type: MyFirstGroupQuery, resolve:() => MyFirstGroupQuery, },

提供的類型,並且如果類型MyFirstGroupQuery每個字段必須具有type定義如GraphQLInt,GraphQLString,GraphQLID即使它是自定義類型,如MyFirstGroupQuery

GraphQLSchema構造函數提供您RootQuery這是QueryType,這是一個GraphQLSchema它只接受rootQueryGraphQLObjectType其字段必須具有type定義

GraphQL嚴格型的,你的所有字段必須具有type定義

https://github.com/graphql/graphql-js

https://github.com/graphql/graphql-js/blob/master/src/type/schema.js#L32

const { 
    GraphQLID, 
    GraphQLInt, 
    GraphQLString, 
    GraphQLObjectType, 
    GraphQLSchema, 
    GraphQLList, 
} = require('graphql'); 

const AppType = new GraphQLObjectType({ 
    name: 'App', 
    description: 'Generic App Details', 

    fields:() => ({ 
     name: { type: GraphQLString }, 
     appId: { type: GraphQLInt }, 
    }), 
}); 

// const MyFirstQuery = { 
//  type: new GraphQLList(AppType), 
//  args: { 
//   appId: { type: GraphQLInt }, 
//  }, 
//  resolve: (root, args) => fetchApp(args.appId), 
// }; 

const myFirstQuery = new GraphQLObjectType({ 
    name: 'First', 
    fields:() => ({ 
     app: { 
      type: new GraphQLList(AppType), 
      args: { 
       appId: { type: GraphQLInt }, 
      }, 
      resolve: (root, args) => fetchApp(args.appId), 
     }, 
    }), 
}); 

/* snip MySecondQuery, MyThirdQuery, MyFourthQuery */ 

const MyFirstGroupQuery = new GraphQLObjectType({ 
    name: 'myFirstGroup', 
    description: 'the first group of queries', 
    fields:() => ({ 
     myFirstQuery: { 
      type: myFirstQuery, 
      resolve:() => [], // promise 
     }, 
     // mySecondQuery: { 
     //  type: MySecondQuery, 
     //  resolve:() => //data 
     // } 
     // myThirdQuery: { 
     //  type: MyThirdQuery, 
     //  resolve:() => // data 
     // } 
     // myFourthQuery: { 
     //  type: MyFourthQuery, 
     //  resolve:() => //data 
     // } 
    }), 
}); 

/* snip MySecondGroupQuery, MyThirdGroupQuery and their types */ 

const QueryType = new GraphQLObjectType({ 
    name: 'query', 
    description: 'read-only query', 

    fields:() => ({ 
     myFirstGroup: { 
      type: MyFirstGroupQuery, 
      resolve:() => MyFirstGroupQuery, 
     }, 
     // mySecondGroup: { 
     //  type: MySecondGroupQuery, 
     //  resolve: MySecondGroupQuery 
     // } 
     // myThirdGroup: { 
     //  type: MyThirdGroupQuery, 
     //  resolve: MyThirdGroupQuery 
     // } 
    }), 
}); 

const Schema = new GraphQLSchema({ 
    query: QueryType, 
}); 

module.exports = Schema; 

GraphiQL

enter image description here

+0

謝謝! 「GraphQLSchema」中省略了這個類型的事實讓我感到沮喪! –