私は 3 つのマイクロサービスで NestJS を使用してから、graphQL フェデレーションを使用して単一の graphQL エンドポイントを提供しています。現在の問題は、各マイクロサービスが、そのマイクロサービスに属していないものも含め、すべてのオブジェクト タイプを公開していることです。スキーマ変換を使用して型定義を除外したいと考えています。私はこれを部分的にしか機能させていません。
GraphQLFederationModule.forRoot({
autoSchemaFile: join(process.cwd(), 'schema.gql'),
debug: true,
introspection: true,
useGlobalPrefix: true,
transformSchema: (schema: GraphQLSchema): GraphQLSchema => {
// works > user not inluded `'{"query":"query IntrospectionQuery {\n __schema {\n queryType {\n name\n }\n ......`
// NOT working `{"query": "query __ApolloGetServiceDefinition__ { _service { sdl } }"}`
const filter = new FilterTypes(type => {
return type.name != 'User';
});
return filter.transformSchema(schema);
},
schemaTransforms: [
(schema: GraphQLSchema): GraphQLSchema => {
//never gets called
console.log('schema', schema);
return schema;
},
]
}),
したがって、上記の例では、次のことが起こります。
- Playground がマイクロサービスからスキーマを直接クエリする場合、スキーマには User タイプが含まれません
- schema.gql ファイルには、まだ User タイプが含まれています。
- NestJs ゲートウェイは
{"query": "query __ApolloGetServiceDefinition__ { _service { sdl } }"}
grpgql エンドポイントで以下を呼び出しますが、これにはまだ User タイプが含まれています
スキーマを一貫して変換する方法があるとよいでしょう。誰もそれを行う方法を知っていますか?