2017-07-07 11 views
0

午前の皆さん、私は現在GraphQLをREST APIの上に記述しています。 JSONレスポンスは、id、name、email、street、suite、city、およびzipcodeからなるオブジェクトである 'address'などの要素を含む 'user'オブジェクトであるとします。内部に複数の要素が含まれているこの「アドレス」フィールドのスキーマで、型を宣言する必要があります。私はドキュメントを見て、自分のシナリオで正しいタイプが何であるか理解できませんでした。REST APIの上にあるGraphQL

関連スキーマの抜粋は以下の通りです:

export default new GraphQLObjectType({ 
    name: 'User', 
    description: 'User(s) object in JSONPlaceholder Fake API', 
    fields:() => ({ 
     id: { 
      type: GraphQLID 
     }, 
     name: { 
      type: GraphQLString 
     }, 
     username: { 
      type: GraphQLString 
     }, 
     email: { 
      type: GraphQLString 
     }, 
     address: { 
      type: (?) 
     } 
    }) 
}) 

以下は、私がターゲットに私のJSON APIです。

{ 
    "id": 1, 
    "name": "Leanne Graham", 
    "username": "Bret", 
    "email": "[email protected]", 
    "address": { 
    "street": "Kulas Light", 
    "suite": "Apt. 556", 
    "city": "Gwenborough", 
    "zipcode": "92998-3874", 
    "geo": { 
     "lat": "-37.3159", 
     "lng": "81.1496" 
    } 
    }, 
    "phone": "1-770-736-8031 x56442", 
    "website": "hildegard.org", 
    "company": { 
    "name": "Romaguera-Crona", 
    "catchPhrase": "Multi-layered client-server neural-net", 
    "bs": "harness real-time e-markets" 
    } 
} 

私は別のオブジェクトを作成し、それだけで特定の「アドレス」オブジェクトを取得するためにリゾルバを作成すると思うが、それは私が二回照会していますを意味します。私はこれを避けるためにいくつかの回避策があるかもしれないと仮定します。

ありがとうございます!

答えて

0

あなたが言及したように、新しいGraphQLObjectTypeを作成してアドレスオブジェクトとそのフィールドを表現し、これをアドレスのタイプとして設定する必要があります。この場合、フィールド名がJSONペイロードと一致するので、カスタムリゾルバの必要はありません。

REST APIへの重複呼び出しが終了する可能性がある場合は、dataloadersのFacebookブックが役立ちます。これを使用して、リクエストごとにREST APIに対する要求が1回だけ行われるようにすることができます。また、バッチ処理のような他の処理も手助けすることができます。おかげで!私は実際にあなたが上記のように、単に宣言することができ、オブジェクトの中に含まれるオブジェクトことを考え出してきた

const AddressType = new GraphQLObjectType({ 
    name: 'AddressType', 
    description: 'Address', 
    fields:() => ({ 
     // then add all the fields on address 
    }) 
}) 

export default new GraphQLObjectType({ 
    name: 'User', 
    description: 'User(s) object in JSONPlaceholder Fake API', 
    fields:() => ({ 
     id: { 
      type: GraphQLID 
     }, 
     name: { 
      type: GraphQLString 
     }, 
     username: { 
      type: GraphQLString 
     }, 
     email: { 
      type: GraphQLString 
     }, 
     address: { 
      type: AddressType 
     } 
    }) 
}) 
+0

-

あなたのコードは次のようになります。しかし、奇妙なことに、キャッシュメカニズムは、load()メソッドやDataLoaderオブジェクト内のHTTPリクエストで渡された引数に基づいて同様の要求を検出できますか? 私の意見では、load()メソッドの中括弧内の引数を渡して、HTTPリクエストで修正するためにアンパックするか、単に読み込み専用のDLオブジェクトを返す引数を受け付ける関数を呼び出します特定の(そして操作された)引数?どの方法をお勧めしますか? –

+0

ローダーをかなり使用しています。私たちがオブジェクトを渡すために複数のパラメーターを渡す必要がある場合は、私たちのチームで(中かっこでロードする)これを行う場合は、デフォルトでcacheKeyFnを提供することが重要です。これは、値の比較ではなくIDの比較を使用します。キーが同じ順序で提供される小さなオブジェクトの場合、 'cacheKeyFn:JSON.stringify' –

関連する問題