7

だから私はこの2つのスキーマを持っています

スキーマ 1

type Permission {
    relation: Relation
}

enum Relation {
    ONE
    TWO
    THREE
}

スキーマ 2

type Permission {
    relation: Relation
}

enum Relation {
    FOUR
    FIVE
    SIX
}  

期待される結果は次のようになります: (しかし、私はさまざまなアイデアを受け入れることができます) マージ後に作成したいクエリは次のとおりです。

{
    permissions{
        relation
    }
}

そして、次のような結果を得る

"permissions": [
  {
    "relation": "ONE"
  },
  {
    "relation": "SIX"
  }
]

また

"permissions": [
  {
    "relation": "schema1ONE"
  },
  {
    "relation": "schema2SIX"
  }
]

そして、次のような突然変異:

mutation{
  createPermission(
    relation: ONE
  ){
    relation
  }
}

mutation{
  createPermission(
    relation: SIX
  ){
    relation
  }
}

また

mutation{
  createPermission(
    relation: schema1ONE
  ){
    relation
  }
}

mutation{
  createPermission(
    relation: schema2SIX
  ){
    relation
  }
}

私はtransformSchemagraphql-toolsで関数を使用しようとしていますが、正しく理解できません:

const Schema1 = await getRemoteSchema('schema1_url', 'schema1');
const Schema2 = await getRemoteSchema('schema2_url', 'schema2');

const schemas = [Schema1, Schema2]

const schema = mergeSchemas({
  schemas: schemas,
  resolvers: {}
});

getRemoteSchema 定義

export const getRemoteSchema = async (uri: string, schemaName: string): Promise<GraphQLSchema> => {
  const httpLink = new HttpLink({ uri, fetch });

  const schema = await introspectSchema(httpLink);

  const executableSchema = makeRemoteExecutableSchema({
    schema,
    httpLink,
  });

  // transform schema by renaming root fields and types
  const renamedSchema = transformSchema(
    executableSchema,
    [
      new RenameTypes(name => {
        if (name == 'Relation') {
          return schemaName + name
        } else {
          return name
        }
      }),
      // new RenameRootFields((operation, name) => `${schemaName}_${name}`)
    ]
  );

  return renamedSchema;
}    

私はこのグリッチを作成しましたhttps://glitch.com/edit/#!/schema-stitching-conflict ということで、問題が見やすくなりました。

4

2 に答える 2

0

現在、graphql-toolsmergeSchemas()を使用して目的の動作を実現するための簡単な方法はありません。これは、オプションの実装でonTypeConflict最初に非推奨になり、後で削除されたためです。ただし、パブリック インターフェイスにはまだ存在します。このオプションを使用すると、競合する型とそれに対応する AST を認識するコールバックを簡単に渡すことができました。

transformSchema()ただし、使用しようとすると、列挙型の名前のみが変更され、列挙型の値は変更されません。目標を達成するには、定義済みの変換を使用するのではなく、独自の変換を実装する必要がある可能性が高くなります。ただし、実装を確認することをお勧めしConvertEnumValuesます。これにより、独自の を実装する際に、必要に応じて AST をどのように歩き回って操作するかについて、より良い感覚が得られるかもしれませんTransform

たとえば、名前の競合が発生した場合に、見たすべてのものを追跡GraphQlEnumTypesし、それらを深くマージする実装を検討します。モジュール スコープ内の変数を使用して追跡するか、 のインスタンス プロパティを使用して追跡しますTransform。後者を行う場合は、事前にインスタンス化し、tranformSchema()参照によって後続の呼び出しに渡すことを忘れないでください。

于 2019-02-12T07:27:28.680 に答える