Кто-нибудь успешно разместил конечную точку Hasura GraphQL за федеративным шлюзом Apollo? Я знаю, что Хасура хочет действовать как точка федерации, но я бы предпочел этого не делать ... текущая мысль состоит в том, чтобы создать сервер apollo с удаленной схемой для подключения Хасуры, а затем, но это за шлюз ... ищу какие-либо мысли или рекомендации о том, возможно ли это?

Мне хочется сказать, что это не потому, что я не вижу никого, кто пытался это сделать. Я не уверен, разрешит ли конечная точка Hasura. «себя» таким образом объединить.

Я начал процесс, но изначально не смог получить сервер Express Apollo Server с удаленной схемой для подключения к конечной точке Hasura, поэтому меньший вопрос заключается в том, возможно ли это вообще.

Приветствия .

5
T.Davidson 9 Окт 2019 в 15:06

1 ответ

Лучший ответ

Можно смонтировать Hasura через apollo-gateway [1], используя простой обходной путь. Основным требованием является наличие поля с именем _service в вашей схеме graphql [2]. Поле _service - это не что иное, как схема Хасуры в формате Schema Definition Language (SDL).

Вы можете добавить это поле к вашему типу 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, который представляет собой схему Hasura в формате SDL, т.е.

// 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;

Вы можете получить SDL схемы Hasura автоматически с помощью многих инструментов сообщества, включая graphql-js [4] или graphqurl [5].

Полностью автоматизированный пример размещен здесь: https://gist.github.com/tirumaraiselvan/65c6fa80542994eda6ad06 >

ПРИМЕЧАНИЕ : apollo-gateway в настоящее время не поддерживает subscriptions [6], поэтому вам нужно будет удалить поле subscription из schema root в сгенерированном SDL, в противном случае возникает странная ошибка.

  1. Это позволяет обслуживать Hasura только через apollo-gateway и не означает, что это включает возможности федерации.
  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
7
tselvan 8 Ноя 2019 в 02:28