2017-01-31 8 views
2

私はこのようなクエリを送信したいエンドでGraphQLネストされたクエリ定義

peopleList, peopleSingle, peopleEdit, peopleAdd, peopleDelete companyList, companySingle, companyEdit, companyAdd, companyDelete etc. 

ようなクエリをオフに取り除くために、私のクエリにツリー状の構造を作成しようとしています:

query test { 
    people { 
    list { 
     id 
     name 
    } 
    single(id: 123) { 
     id 
     name 
    } 
    } 
    company { 
    list { 
     id 
     name 
    } 
    single(id: 456) { 
     id 
     name 
    } 
    } 
} 

mutation test2 { 
    people { 
    create(data: $var) { 
     id 
     name 
    } 
    } 
    people { 
    edit(id: 123, data: $var) { 
     id 
     name 
    } 
    } 
} 

これは、人々モジュール上の私のクエリオブジェクトの一部です:

people: { 
    type: //What type this should be? 
    name: 'Root of People queries', 
    fields:() => ({ 
    list: { 
     type: peopleType, 
     description: 'Returns all people in DB.', 
     resolve:() => { 
     // resolve method implementation 
     } 
    }, 
    single: { 
     type: peopleType, 
     description: 'Single row from people table. Requires ID argument.', 
     args: { 
     id: { type: new GraphQLNonNull(GraphQLID) } 
     }, 
     resolve:() => { 
     // resolve method implementation 
     } 
    } 
    }) 
} 

私はGraphQLObjectTypeにこのスニペットを置くことを試みているとRootQueryで(GraphQLObjectTypeを再び使用して)それらを結合します - うまくいかなかった。

代わりに、新しいタイプを作成することができます。このタイプのpeopleQueriesTypeのように、すべてのクエリをフィールドとして指定し、このオブジェクトに対して単一のクエリを作成します。しかし、これは私にとっては奇妙に思われます。私のコードを木のような形でマージするために、不要なオブジェクトでコードを汚染します。

このような種類のクエリ構造を行うことができますが、ドキュメントでヘルプを見つけることができない場合は、Apolloサーバーの実装を見てみました。

私は自分のサーバー上でnode.js + express + graphql-jsを使用しています。

答えて

2

短い答え:

type: new GraphQLObjectType({ name: 'patientQuery', fields: { find, findOne } }) 

詳細:私は以下のコードを使用して、このクエリを使用して終わった:

{ 
    patient { 
    find { 
     id 
     active 
    } 
    findOne(id: "pat3") { 
     id 
     active 
    } 
    } 
} 

タイプは、このようなすべてのフィールドを含む GraphQLObjectTypeする必要があります

in patient/queries/index.js私はこれを持っています

import findOne from './find-one.js'; 
import find from './find.js'; 
import { GraphQLObjectType } from 'graphql'; 

export default { 
    patient: { 
    type: new GraphQLObjectType({ name: 'patientQuery', fields: { find, findOne } }), 
    resolve(root, params, context, ast) { 
     return true; 
    } 
    } 
}; 

その後、queries.js

import patient from './patient/queries/index.js'; 
export default { 
    ...patient 
}; 

と特急サーバーにgraphqlに渡され、最終的には私のスキーマschema.js

import { 
    GraphQLObjectType, 
    GraphQLSchema 
} from 'graphql'; 

import queries from './queries'; 
import mutations from './mutations'; 

export default new GraphQLSchema({ 
    query: new GraphQLObjectType({ 
    name: 'Query', 
    fields: queries 
    }), 
    mutation: new GraphQLObjectType({ 
    name: 'Mutation', 
    fields: mutations 
    }) 
}); 
関連する問題