Apollo 网关使用 NestJS 格式化时出错

问题描述 投票:0回答:1

我有 GraphQL 服务(apollo),由 apollo 网关联合 NestJS 制作。 我的服务返回一个格式化的 graphql 错误,我在扩展中添加了内部错误代码和一些其他信息。我返回一个

ApolloError

当我直接请求服务时,它运行得很好,但由于我使用网关进行联合,所以不行。网关返回其自己的错误,并且我无法访问其错误格式中的基本错误。

有人有什么想法吗?

服务设置:

GraphQLModule.forRoot<ApolloFederationDriverConfig>({
  driver: ApolloFederationDriver,
  // autoSchemaFile: true,
  autoSchemaFile: {
    federation: 2,
  },
  playground: false,
  buildSchemaOptions: {
    orphanedTypes: [TeamDto],
  },
  formatError: (gqlError, error) => {
    const isBaseError = error?.['extensions']?.['is_error'];
    console.log('formatError', error);

    if (isBaseError) {
      return error['extensions'];
    }
    return new BaseError(gqlError.message, KnowError.GRAPHQL_ERROR, 500, {
      code: gqlError.extensions?.code,
    }).toJSON();
  },
})

网关设置:

GraphQLModule.forRoot<ApolloGatewayDriverConfig>({
  driver: ApolloGatewayDriver,
  server: {
    playground: false,
    plugins: [
      ApolloServerPluginLandingPageLocalDefault(),
    ],
    formatError: (gqlError, error: any) => {
      const serviceError =
        error.extensions.response?.body?.errors?.[0]?.extensions;

      console.log('formatError', error.extensions);

      return gqlError;
    },
  },
  gateway: {
    supergraphSdl: new IntrospectAndCompose({
      subgraphs: [
        { name: 'account', url: 'http://localhost:3001/graphql' },
        // { name: 'team', url: 'http://localhost:3002/graphql' },
      ],
    }),
  },
})

我尝试通过扩展(插件)我设法通过以下方式访问错误:

buildService.didReceiveResponse
但我不知道如何返回此错误

nestjs apollo apollo-server apollo-federation apollo-gateway
1个回答
0
投票

我从服务中获取错误(已包装)并将其格式化在网关中。 我之前尝试过服务中的格式错误,但它仍然包装在网关中,所以我认为我们只需要网关中的格式。

 GraphQLModule.forRootAsync<ApolloGatewayDriverConfig>({
      driver: ApolloGatewayDriver,
      useFactory: () => ({
        server: {
          formatError: (error) => {
            return {
              message: error.message,
              code: error.extensions?.code,
              errCode: error.extensions?.errorCode,
            };
          },
        },
        gateway: {
          supergraphSdl: new IntrospectAndCompose({
            subgraphs: [
              {
                name: 'a',
                url: `http://localhost:${process.env.a}/graphql`,
              },
              {
                name: 'b',
                url: `http://localhost:${process.env.b}/graphql`,
              },
            ],
          }),
        },

© www.soinside.com 2019 - 2024. All rights reserved.