問題タブ [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.

0 投票する
0 に答える
331 参照

apollo-server - Apollo フェデレーション: インターフェースを実装する 2 つの別個のサービスからエンティティを返すフィールド/リゾルバー

概要

GraphQL Apollo マネージド フェデレーションでは、1 つのサービスが 2 つの個別のサービスのエンティティの配列を返す集計フィールドを持つことが可能かどうかを調べようとしています。のように、私はこのユースケースをサポートしようとしています:

両方どこ

内部では、(サービス 2 に存在する) のリゾルバーaggregateFieldがサービス 1 をService1Entitys に呼び出します。したがって、このフィールドは 2 つのデータ セットを集約しています。

例題

現在の GraphQL セットアップでは、これらすべてを 1 つのサービスで定義しています。

サービスにクエリを実行すると、リゾルバーにヒットし、animals次のようになります。

今、私はDogsサービスを作成しています。私はDogsDogサービスから、CatsはCatsサービスから来たいです。さらに、集計フィールドを引き続きサポートしanimalsたいと考えており、それをサービスに移動したいと考えていDogsます。

これをサポートするためにCat、エンティティを作成し、両方のサービスでインターフェイスを複製しました。CatDog サービスが型を解決できるようにするために、 「参照」を使用して、Dog サービスが別の場所にあることを伝えましCatた。

Cat サービス (Cat をエンティティとして でマーク@key):

ドッグサービス:

このセットアップの問題は、次の GraphQL エラーが原因で、Dog サービスの開始に失敗することです。

エラー: インターフェース フィールド Animal.name が必要ですが、Cat はそれを提供しません。

私の Dog サービスで、外部nameフィールドを追加すると、次のようになります。

次に、マネージド フェデレーションで 2 つのサービスを構成できません。

このデータ グラフには有効な構成がありません。[dog] Cat.name -> は @external としてマークされていますが、@requires、@key、または @provides ディレクティブでは使用されていません。

ここで間違った道を進んでいるような気がします。あるサービスが別のサービスのエンティティと組み合わせて独自のエンティティを返すことができる、このような集約フィールドを持つことは可能ですか?

すでに多くのクライアントがanimalsフィールドを照会しているため、クライアントの変更を必要とせずに、つまりインターフェイスの使用を再構築せずに、この変更をサポートしようとしています。