我将nestJS 与3 个微服务一起使用,然后使用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 直接从微服务查询架构时,架构不包含用户类型
- schema.gql 文件仍然包含用户类型。
- nestJs 网关在 grapgql 端点上调用以下内容
{"query": "query __ApolloGetServiceDefinition__ { _service { sdl } }"}
,并且仍然包含 User 类型
最好有一种方法可以始终如一地转换模式。有谁知道这样做的方法?