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