有没有人成功地将Hasura GraphQL端点放置在Apollo联合网关的后面?我知道Hasura希望充当联邦的要点,但我不愿意这样做...当前的想法是使用远程模式创建一个连接Hasura的阿波罗服务器,然后成为网关...看起来对于是否可行有任何想法或指导?

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

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

干杯。

最佳答案

可以使用简单的解决方法将Hasura安装在阿波罗网关[1]上。基本要求是在graphql模式[2]中有一个称为_service的字段。 _service字段不过是Schema Definition Language(SDL)格式的Hasura模式。

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

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 hasuraSchema,它是SDL格式的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

注意:阿波罗网关当前不支持subscriptions [6],因此您需要从生成的SDL中的subscription中删除schema root字段,否则会引发奇怪的错误。
  • 这仅允许通过阿波罗网关服务Hasura,并不意味着它启用联盟功能。
  • https://www.apollographql.com/docs/apollo-server/federation/federation-spec/#fetch-service-capabilities
  • https://docs.hasura.io/1.0/graphql/manual/remote-schemas/index.html
  • https://graphql.org/graphql-js/utilities/#printintrospectionschema
  • https://github.com/hasura/graphqurl#export-schema
  • https://github.com/apollographql/apollo-server/issues/2360#issuecomment-531849628
  • 09-16 06:49