首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以网关服务器为服务的阿波罗联邦

以网关服务器为服务的阿波罗联邦
EN

Stack Overflow用户
提问于 2019-06-07 17:06:05
回答 1查看 2.8K关注 0票数 3

关于这一问题的摘要已在“吉突”问题中作了说明:

https://github.com/apollographql/apollo-server/issues/2794

简而言之,是否有一种实现阿波罗联邦的方法,使网关本身拥有自己的模式?

联合阿波罗服务器,其中网关本身有一个模式

@apollo/gateway@0.6.5 @apollo/federation@0.6.2

预期行为

当我实例化我的阿波罗网关服务器时,我希望我能够合并来自联邦服务的模式,以及来自网关本身的模式。

实际行为

网关服务器无法挂载/graphql路由,因为它希望在此之前所有服务都在运行。

在运行时,以下错误将打印到控制台:

代码语言:javascript
复制
POST /graphql 404 11.251 ms - 147
Encountered error when loading gateway-app at http://localhost:8000/graphql: invalid json response body at http://localhost:8000/graphql reason: Unexpected token < in JSON at position 0
[DEBUG] Fri Jun 07 2019 12:11:07 GMT-0400 (Eastern Daylight Time) apollo-gateway: Configuration loaded for Gateway
[DEBUG] Fri Jun 07 2019 12:11:07 GMT-0400 (Eastern Daylight Time) apollo-gateway: Composing schema from service list:
  remove-svc
TypeError: schema.toConfig is not a function
    at Object.composeServices (/gateway-app/node_modules/@apollo/federation/dist/composition/compose.js:191:67)
    at Object.composeAndValidate (/gateway-app/node_modules/@apollo/federation/dist/composition/composeAndValidate.js:13:41)
    at ApolloGateway.createSchema (/gateway-app/node_modules/@apollo/gateway/dist/index.js:90:47)
    at ApolloGateway.<anonymous> (/gateway-app/node_modules/@apollo/gateway/dist/index.js:81:22)
    at Generator.next (<anonymous>)
    at fulfilled (/gateway-app/node_modules/@apollo/gateway/dist/index.js:4:58)
    at process._tickCallback (internal/process/next_tick.js:68:7)

源代码

代码语言:javascript
复制
const url = new URL(`redis://${REDIS_URL}:${REDIS_PORT}/${REDIS_DATABASE}`).toString()

const cache = new RedisCache({ url })

const context = ({ req }) => {
  if (!(req.user || req.headers.authorization === ROUTE_AUTH)) {
    throw new AuthenticationError('Not authenticated')
  }
  return { user: req.user, req: req }
}

try {
  const loadGateway = async () => {
    try {
      const { schema, executor } = await gateway.load()
      return { schema, executor }
    } catch (err) {
      console.error(err)
      return null
    }
  }

  const gateway = new ApolloGateway({
    debug: process.env.ENV !== 'prod',
    serviceList: [
      { name: 'gateway', url: `${GATEWAY_HOSTNAME}/graphql` },
      { name: 'remote-svc', url: `${REMOTE_SERVICE_HOSTNAME}/graphql` },
    ],
  })

  const { schema, executor } = loadGateway()
  const server = new ApolloServer({
    schema,
    executor,
    cache,
    dataSources,
    engine: { apiKey: ENGINE_API_KEY },
    tracing: true,
    context,
  })
  server.applyMiddleware({ app })
} catch (err) {
  console.error(err)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 20:46:23

根据我的问题报告的原始错误,有两个错误。

  1. 阿波罗网关服务器不能也不应该是具有自己模式的联邦服务(请参阅Github第2792期)。

来自阿波罗:

在这里,我将根据您的服务的命名得出一个结论:您是否试图在端口8000上运行网关,同时将其视为一个联邦服务?如果是这样的话,这是行不通的;网关必须先解析所有模式,然后才能组成最终的模式。

  1. GraphQL核心依赖至少必须是14.2.0版本(参见Github第2825期)。

来自GraphQL JS Changelogs:

toConfig旨在通过最小化所需编写和维护的代码量来帮助模式转换,例如来自graphql-tools的recreateType。 当我在graphql-voyager上工作时,我创建了自己的intermidiate格式,只是为了进行模式转换。 此外,toConfig将防止添加新字段时出现的bug。例如,lexicographicSortSchema不尊重新添加的assumeValid和allowedLegacyNames字段。

在将模式从网关迁移到自己的联邦服务并将我的核心GraphQL依赖项更新到适当的版本之后,我成功地实现了网关/联邦模式。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56498605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档