5

有没有人成功地将 Hasura GraphQL 端点放置在 Apollo 联合网关后面?我知道 Hasura 想要充当联邦点,但我宁愿不这样做......目前的想法是创建一个带有远程模式的 apollo 服务器来连接 Hasura,然后网关后面......寻找任何关于这是否可能的想法或指导?

我想说这不是因为我看不到任何尝试过的人。我不确定 Hasura 端点是否允许。“本身”以这种方式联合起来。

我已经开始了这个过程,但最初无法获得一个带有远程方案的 Express Apollo 服务器来连接到 Hasura 端点,所以一个较小的问题是这是否可能。

干杯。

4

1 回答 1

8

可以使用简单的解决方法在 apollo-gateway [1] 上安装 Hasura。基本要求是_service在您的 graphql 模式 [2] 中调用一个字段。该_service字段只不过是Schema Definition Language(SDL)格式的 Hasura 模式。

您可以query使用远程模式 [3] 将此字段添加到您的类型中。这是一个示例远程模式:

const { ApolloServer } = require('apollo-server');
const gql = require('graphql-tag');
const hasuraSchema = require('./schema.js');

const typeDefs = gql`

  schema {
    query: query_root
  }

  type _Service {
    sdl: String
  }

  type query_root {
    _service: _Service!
  }

`;

const resolvers = {
    query_root: {
        _service: () =>  { return {sdl: hasuraSchema} },
    },
};

const schema = new ApolloServer({ typeDefs, resolvers });

schema.listen({ port: process.env.PORT}).then(({ url }) => {
    console.log(`schema ready at ${url}`);
});

这里的关键值是const hasuraSchemaSDL 格式的 Hasura 模式,即

// schema.js

const hasuraSchema = `

# NOTE: does not have subscription field
schema {
  query: query_root
  mutation: mutation_root
}

type articles {
  id: Int!
  title: String!
}

type query_root {
 ...
}

type mutation_root {
 ...
}
`

module.exports = hasuraSchema;

您可以使用包括 graphql-js [4] 或 graphqurl [5] 在内的许多社区工具自动获取 Hasura 模式的 SDL。

此处发布了一个完全自动化的示例:https ://gist.github.com/tirumaraiselvan/65c6fa80542994ed6ad06fa87a443364

注意:apollo-gateway 当前不支持subscriptions[6],因此您需要subscription从生成的 SDL 中删除该字段schema root,否则会引发奇怪的错误。

  1. 这仅允许通过 apollo-gateway 为 Hasura 提供服务,并不意味着它启用了联合功能。
  2. https://www.apollographql.com/docs/apollo-server/federation/federation-spec/#fetch-service-capabilities
  3. https://docs.hasura.io/1.0/graphql/manual/remote-schemas/index.html
  4. https://graphql.org/graphql-js/utilities/#printintrospectionschema
  5. https://github.com/hasura/graphqurl#export-schema
  6. https://github.com/apollographql/apollo-server/issues/2360#issuecomment-531849628
于 2019-10-10T06:03:35.710 回答