0

我将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 类型

最好有一种方法可以始终如一地转换模式。有谁知道这样做的方法?

4

0 回答 0