2

这对每个人来说可能都是新的,但希望最好的找到解决方案。

我一直在尝试通过 ApolloGateway 设置阿波罗管理的联盟,以便按照官方文档来联合我的服务。https://www.apollographql.com/docs/graph-manager/managed-federation/setup/#4-deploy-the-modified-gateway

.env

NODE_ENV=development
APOLLO_KEY=service:service_name:hash

阿波罗网关

import 'reflect-metadata';
import express from 'express';
import {ApolloServer} from 'apollo-server-express';
import {ApolloGateway} from '@apollo/gateway';
import {config} from 'dotenv';
config();

const port = process.env.NODE_PORT || 7000;
const nodeEnv = process.env.NODE_ENV || 'localhost';
const nodeHost = process.env.NODE_HOST || 'http://localhost';
const apolloGatewayConfig: any = {
  __exposeQueryPlanExperimental: false,
};
if (nodeEnv === 'localhost' || true) {
  apolloGatewayConfig.serviceList = [
    {
      name: 'vendors',
      url: `${process.env.GMS_VENDORS_NODE_HOST}/graphql`,
    }
  ];
}
const gateway = new ApolloGateway(apolloGatewayConfig);

(async () => {
  const app = express();
  app.get('/health', (_, res: any): void => {
    res.send({gateway: true});
  });

  const {schema, executor} = await gateway.load(); // breaking point
  const server = new ApolloServer({
    schema,
    executor,
    engine: true,
    subscriptions: false,
  });
  server.applyMiddleware({app, path: '/graphql'});

  app.listen({port}, () =>
    console.log(`API Gateway is ready at ${nodeHost}:${port}`)
  );
})();

在行const {schema, executor} = await gateway.load();它抛出一个错误

UnhandledPromiseRejectionWarning: Error: When服务清单is not set, an Apollo Engine configuration must be provided.

我一直在关注官方文档,但不确定我在这里遗漏了什么?

4

1 回答 1

2

不确定这是否能解决您的问题,但我有一个类似的问题,我的内省查询将通过本地网关而不是 Apollo Studio;

首先,我必须通过 CLI 在联合配置中部署各个服务(因为直接报告模式尚不可用)

npx apollo service:push --graph=<graph> --key=<my-key> --localSchemaFile=src/schema.graphql --serviceName=<serviceName> --serviceURL=<serviceUrl> --variant=dev

然后,在网关代码中,我必须按照Apollo Studio 设置文档serviceList中的说明从ApolloGateway构造函数中删除:

此选项指定每个图形实施服务的名称和 URL。使用托管联合,此信息不再在网关的构造函数中硬编码!相反,网关会定期轮询 Apollo 以获取此信息。这使您能够在图形中添加和删除实施服务,而无需重新启动网关。

完全从构造函数中删除serviceList参数:ApolloGateway

const gateway = new ApolloGateway({
  serviceList: [
    { name: 'test', url: 'http://localhost:4000/graphql'},
  ]
});
...
const gateway = new ApolloGateway();

在您的情况下,这应该可以解决您的问题,但您也应该更新您对 Apollo Server 的使用。{ schema, executor }您可以直接嵌入,而不是使用gateway

const server = new ApolloServer({
  gateway,
  subscriptions: false,
});
于 2020-07-08T07:34:10.423 回答