2017-10-04 6 views
1

はのは、私のgraphqlサーバがperson3person5は、いくつかのidのあるJSONとして、以下のデータをフェッチしたいとしましょう:オブジェクトのアポロ/ GraphQLフィールドタイプに

"persons": { 
    "person3": { 
    "id": "person3", 
    "name": "Mike" 
    }, 
    "person5": { 
    "id": "person5", 
    "name": "Lisa" 
    } 
} 

質問:どのようにスキーマを作成しますアポロとタイプ定義?

ここでのキーperson3person5は、クエリ(クエリで使用されているarea)によって動的に生成されます。だから別の時に私はperson1person2person3を返すかもしれません。 あなたがpersonsを見るように反復処理可能ではないので、以下では、私はアポロで行ったgraphql型定義として動作しません。

type Person { 
    id: String 
    name: String 
} 
type Query { 
    persons(area: String): [Person] 
} 

personsオブジェクトのキーは常に異なる場合があります。

もちろん、受信したJSONデータをpersonsの配列を使用するように変換することもできますが、そのようなデータを扱う方法はありませんか?

+0

「b」と「g」が「自分のクエリによって動的に生成される」という意味を明確にすることはできますか?どちらか一方の存在は要求に含まれるフィールドに依存しますか? –

+0

@DanielReardenしたがって 'b'と' g'はidです。おそらく私はその質問をより明確にするべきです。クエリには人のサブセットのみを取得するオプションが含まれているので、1つのクエリでは、idの 'a'、' b'、 'c'の人が含まれ、' b'や 'g'のような別のクエリの場合、質問。 – Andru

+0

@DanielRearden「b」を「person3」に、「g」を「person 5」に変更し、テキストと変数を追加してより明確にしました。このクエリには、テキストに概説されているように、人々のサブセットのみを取得するオプションが含まれます。 – Andru

答えて

3

GraphQLは、サーバとクライアントの両方に依存し、各タイプで使用可能なフィールドを事前に知っています。場合によっては、クライアントはイントロスペクションを介してこれらのフィールドを検出できますが、サーバーの場合は常に事前に知っておく必要があります。したがって、どういうわけか、返されたデータに基づいてフィールドを動的に生成することは実際には不可能です。

あなたカスタムJSON scalarを利用して、クエリのためにそれを返すことができます:返されたデータは、任意の特定の構造に合うようにするためにあなたが戻って送ることができるように、JSONを利用することにより

type Query { 
    persons(area: String): JSON 
} 

、あなたが要件をバイパスするものは何でもあなたはそれが適切にフォーマットされたJSONであることを望んでいます。

もちろん、これには重大な欠点があります。たとえば、以前使用していたタイプのセーフティネットが失われてしまいます(実際には構造体が返される可能性があります。間違ったものを返す場合は、クライアントが試みるまでそれを知ることはできません)それを使用して失敗する)。また、返されたデータ内の任意のフィールドに対してリゾルバを使用する能力が失われます。

しかし...あなたの葬儀:)

(あなたはあなたの質問で提案されているように)はさておき、私はそれをクライアントに返送する前に、配列にデータを平らに検討するとして。クライアントコードを書いていて、動的なサイズの顧客リストを扱っているならば、idでキーを付けられたオブジェクトではなく、配列がはるかに扱いやすくなります。たとえば、Reactを使用していて、顧客ごとにコンポーネントを表示している場合は、そのオブジェクトを配列に変換して終了させることになります。 APIを設計する際には、データの追加処理を避けるよりもクライアントのユーザビリティを考慮する必要があります。

+0

ご意見ありがとうございます!私はサーバーからの着信データを変換します。 FYI:アイデンティティを持つオブジェクトの理由は、特定の人にアクセスするためのidの検索だけであるため、クライアント側での検索が高速でした。 – Andru

+0

私の状況では、Rails/GraphQL APIを介して検証エラーが返されています。どのキーにエラーが発生するかは事前にわからないため、カスタムJSONスカラーを使用しています。 –

+0

実際には、エラーのあるフィールドを一貫して返すことを可能にするネストされた配列の使用方法を変更しました。 –

関連する問題