問題タブ [apollo-federation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
apollo-server - Apollo フェデレーション: インターフェースを実装する 2 つの別個のサービスからエンティティを返すフィールド/リゾルバー
概要
GraphQL Apollo マネージド フェデレーションでは、1 つのサービスが 2 つの個別のサービスのエンティティの配列を返す集計フィールドを持つことが可能かどうかを調べようとしています。のように、私はこのユースケースをサポートしようとしています:
両方どこ
と
内部では、(サービス 2 に存在する) のリゾルバーaggregateField
がサービス 1 をService1Entity
s に呼び出します。したがって、このフィールドは 2 つのデータ セットを集約しています。
例題
現在の GraphQL セットアップでは、これらすべてを 1 つのサービスで定義しています。
サービスにクエリを実行すると、リゾルバーにヒットし、animals
次のようになります。
今、私はDogs
サービスを作成しています。私はDogs
Dogサービスから、CatsはCatsサービスから来たいです。さらに、集計フィールドを引き続きサポートしanimals
たいと考えており、それをサービスに移動したいと考えていDogs
ます。
これをサポートするためにCat
、エンティティを作成し、両方のサービスでインターフェイスを複製しました。Cat
Dog サービスが型を解決できるようにするために、 「参照」を使用して、Dog サービスが別の場所にあることを伝えましCat
た。
Cat サービス (Cat をエンティティとして でマーク@key
):
ドッグサービス:
このセットアップの問題は、次の GraphQL エラーが原因で、Dog サービスの開始に失敗することです。
エラー: インターフェース フィールド Animal.name が必要ですが、Cat はそれを提供しません。
私の Dog サービスで、外部name
フィールドを追加すると、次のようになります。
次に、マネージド フェデレーションで 2 つのサービスを構成できません。
このデータ グラフには有効な構成がありません。[dog] Cat.name -> は @external としてマークされていますが、@requires、@key、または @provides ディレクティブでは使用されていません。
ここで間違った道を進んでいるような気がします。あるサービスが別のサービスのエンティティと組み合わせて独自のエンティティを返すことができる、このような集約フィールドを持つことは可能ですか?
すでに多くのクライアントがanimals
フィールドを照会しているため、クライアントの変更を必要とせずに、つまりインターフェイスの使用を再構築せずに、この変更をサポートしようとしています。