2017-11-01 5 views
6

新に2つのRESTエンドポイントのマージ:が、私は次のスキーマを使用しています単一GraphQL応答graphQLへ

type Item { 
    id: String, 
    valueA: Float, 
    valueB: Float 
    } 

    type Query { 
    items(ids: [String]!): [Item] 
    } 

(& B)の各タイプの単一の要求で複数の項目を返すことができます私のAPIが、タイプAのための

REST要求::api/a/items?id=[1,2]
応答:tに対して

[ 
    {"id":1,"value":100}, 
    {"id":2,"value":30} 
] 

REST要求ではない、すなわち、両方のためにypeB:api/b/items?id=[1,2]
応答:

[ 
    { 
    id: "1", 
    valueA: 100, 
    valueB: 50 
    }, 
    { 
    id: "2", 
    valueA: 30, 
    valueB: 20 
    } 
] 

Q:どのように1は書くでしょう

[ 
    {"id":1,"value":50}, 
    {"id":2,"value":20} 
] 

私はそうのような単一graphQL応答にそれらの2のAPIエンドポイントを統合したいと思いますリゾルバはを実行します。それぞれのタイプ(複数のアイテムの応答を取得する)で1つずつフェッチします。クエリが不要なフェッチがトリガされていないことを確認します型すなわち欠け:

{items(ids:["1","2"]) { 
    id 
    valueA 
}} 

上記の例のみapi/a/items?id=[1,2]をフェッチする必要があるとgraphQL応答は次のようになります。

[ 
    { 
    id: "1", 
    valueA: 100 
    }, 
    { 
    id: "2", 
    valueA: 30 
    } 
] 

答えて

2

だから私はあなたが言語としてJavaScriptを使用していると仮定。あなたは、この場合に必要なのだから、クエリは、我々はの一部であるフィールドを見つけるために、これらのフラグメントにアクセスする必要がリゾルバに

{ 
    items(ids:["1","2"]) { 
     ...data 
    }} 

    fragment data on Item { 
     id 
     valueA 
    } 
} 

次なる直接クエリを使用しないで、むしろ断片

を使用します断片化し、それに基づいてデータを解決します。以下は簡単なnodejsは、我々はそれを実行すると、出力は

calling API A 
{ data: 
    { items: [ { id: '1', valueA: 0.12 }, { id: '2', valueA: 0.15 } ] } } 

我々は

{ 
    items(ids:["1","2"]) { 
     ...data 
    }} 

    fragment data on Item { 
     id 
     valueA 
     valueB 
    } 
} 

にクエリを変更した場合、出力は

calling API A 
calling API B 
{ data: 
    { items: 
     [ { id: '1', valueA: 0.12, valueB: 0.1 }, 
     { id: '2', valueA: 0.15, valueB: 0.11 } ] } } 
である同じ

const util = require('util'); 

var { graphql, buildSchema } = require('graphql'); 

var schema = buildSchema(` 
    type Item { 
     id: String, 
     valueA: Float, 
     valueB: Float 
    } 

    type Query { 
     items(ids: [String]!): [Item] 
    } 
`); 

var root = { items: (source, args, root) => { 
     var fields = root.fragments.data.selectionSet.selections.map(f => f.name.value); 
     var ids = source["ids"]; 

     var data = ids.map(id => {return {id: id}}); 
     if (fields.indexOf("valueA") != -1) 
     { 
      // Query api/a/items?id=[ids] 
      //append to data; 
      console.log("calling API A") 
      data[0]["valueA"] = 0.12; 
      data[1]["valueA"] = 0.15; 
     } 

     if (fields.indexOf("valueB") != -1) 
     { 
      // Query api/b/items?id=[ids] 
      //append to data; 
      console.log("calling API B") 
      data[0]["valueB"] = 0.10; 
      data[1]["valueB"] = 0.11; 
     } 
     return data 
}, 
}; 

graphql(schema, `{items(ids:["1","2"]) { 
     ...data 
    }} 

    fragment data on Item { 
     id 
     valueA 
    } 

    `, root).then((response) => { 
    console.log(util.inspect(response, {showHidden: false, depth: null})); 
}); 

でファイルされます

これは、 oidはフィールドが必要ないときにapi A/Bを呼び出します。あなたが尋ねた通り正確に

+0

作品はチャーム:) –

関連する問題