Apollo 网关 - 自定义解析器(将 graphql 翻译成 rest)

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

我有一个工作正常的 apollo 网关。它创建一个 supergraphsdl 并将所有请求联合到底层服务(以及 graphql)。

然而, 我有一个 REST 服务(第 3 方),我需要通过 API GW (Apollo) 连接,因此我需要一种方法来将传入的 GQL 请求转换为该特定模式到 REST 请求。

我的阿波罗服务器:

ApolloServer({
    gateway,
    context: createContext,
    introspection: true,
    debug: true,
    formatError: globalErrorFormatter,
  });

和我的 ApolloGateway:

ApolloGateway({
    supergraphSdl: createSuperGraphSdl(serviceSourceMap),
    buildService: ({ url, name }) => {
      const schema = backingSchemas.get(name);
      const isRestService = name.includes("rest");
      if (schema == null) {
        throw new Error(`Missing backing service config for serviceName=${name}`);
      }
      const localGQLDataSource = isRestService ? new CustomDataSource(schema) : new LocalGraphQLDataSource(schema);
      return localGQLDataSource;
    },
  });

这是我的 CustomDataSource

class CustomDataSource extends RemoteGraphQLDataSource {
  willSendRequest({ request }: any): string {
    const serviceUrl = request?.http?.url;
    const queryContent = request.query;
    console.log("----CUSTOM REQUEST:", queryContent);
    console.log("SERVICE URL:", serviceUrl);
  }
}

我可以看到这个类中的查询......但是我无法在这里停止它们并重定向到我的(willSendRequest)不支持退货....

要注意的是,我们有一个特定的 supergraph 设置(自定义实现),默认情况下它不支持指令(我们用来授权、注入……)

知道我错过了什么吗?还是我的方向完全错了??

我需要的是捕获 GQL 查询/突变并将其作为 POST 请求手动重定向到给定服务。

所以让我们说:

mutation {
  login(username: String!, password: String!): String! @unsecured
}

我需要将其转换为

axios.post(, payload);

有什么想法吗?你们能把我带到某个地方或给我一段我可以使用的代码吗?理想情况下是 codepen 或 smth ...不幸的是我无法共享整个网关代码:(但是如果您需要我提供更多/其他详细信息..请告诉我

rest graphql apollo
© www.soinside.com 2019 - 2024. All rights reserved.