ここ

2017-05-29 13 views
3

は、私は、スキーマを作成して、私のエクスプレス、それをサーバに接続するGraphQLスキーマ文字列を使用しています方法ですGraphQL buildSchemaで労働組合を使用する方法:ここ

var graphql = require('graphql'); 
var graphqlHTTP = require('express-graphql'); 
[...] 
    return graphqlHTTP({ 
     schema: graphql.buildSchema(schemaText), 
     rootValue: resolvers, 
     graphiql: true, 
    }); 

これは、モジュールのすべての非常に基本的な使用です。内容を照会することは、それが関係している何が正しいオブジェクトを返しますがメッセージで失敗し、私はこの作品を作るする方法を発見した

union MediaContents = Photo|Youtube 

type Media { 
    Id: String 
    Type: String 
    Contents: MediaContents 
} 

:それはうまく機能し、私は労働組合を定義するまで、非常に便利ですGenerated Schema cannot use Interface or Union types for execution

buildSchemaを使用するときに、すべて共用体を使用できますか?あなたは、単にGraphQLでいつものように、労働組合に__resolveType方法を提供することにより、労働組合を使用することができますhttp://dev.apollodata.com/tools/graphql-tools/resolvers.html#Unions-and-interfaces

:我々はbuildSchemaの生産準備ができて、過給バージョンのようなものですgraphql-toolsパッケージを、作成した理由はまさに

答えて

6

。 JS:

# Schema 
union Vehicle = Airplane | Car 

type Airplane { 
    wingspan: Int 
} 

type Car { 
    licensePlate: String 
} 

// Resolvers 
const resolverMap = { 
    Vehicle: { 
    __resolveType(obj, context, info){ 
     if(obj.wingspan){ 
     return 'Airplane'; 
     } 
     if(obj.licensePlate){ 
     return 'Car'; 
     } 
     return null; 
    }, 
    }, 
}; 

唯一の変更は、代わりにルートオブジェクトとしてあなたのレゾルバを提供するので、使用されてmakeExecutableSchema

const graphqlTools = require('graphql-tools'); 
return graphqlHTTP({ 
    schema: graphqlTools.makeExecutableSchema({ 
    typeDefs: schemaText, 
    resolvers: resolvers 
    }), 
    graphiql: true, 
}); 

また、リゾルバのシグネチャは通常のGraphQL.jsスタイルと一致するため、rootValueを使用したときの結果は(args, context)ではなく(root, args, context)になります。

+0

これは私が思ったことですが、buildSchemaでそれを行う方法はありません。私はプロジェクトに依存関係をもう1つ追加する前に確かめたいと思っていました:) もう1つの質問:私はresolverMapの構文をよく理解していませんが、Vehicleはインラインで定義されたクラスです(前に、私はC++の方が多く、JSでいつも混乱しています:D) –

+1

OK、統合が完了しました。 ありがとう! –

+1

これはすばらしい答えです。ちょうど私が探していたもの。 –