我有 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
但我不知道如何返回此错误
我从服务中获取错误(已包装)并将其格式化在网关中。 我之前尝试过服务中的格式错误,但它仍然包装在网关中,所以我认为我们只需要网关中的格式。
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`,
},
],
}),
},