可以使用简单的解决方法在 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 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
注意:apollo-gateway 当前不支持subscriptions
[6],因此您需要subscription
从生成的 SDL 中删除该字段schema root
,否则会引发奇怪的错误。
- 这仅允许通过 apollo-gateway 为 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