Если вы используете приложение GraphQL в качестве шлюза BFF или API и вам необходимо вызвать Rest API, этот пост для вас.

Я не буду объяснять весь код, потому что предполагаю, что вы уже знакомы с концепциями GraphQL, а код довольно прост.

Если вы никогда раньше не работали с GraphQL, вот отличное место для начала: https://www.howtographql.com/.

Репозиторий Github: https://github.com/tonsaito/graphql-bff

Шаг 1. Начните новый проект, создав новый каталог.

Мы будем использовать каталог с именем / graphql-bff.

Шаг 2. Инициализируйте свой проект.

npm init

Шаг 3. Установите следующие зависимости

npm install apollo-server
npm install apollo-datasource-rest
npm install graphql-import

Шаг 4. Создание источников данных

Сначала создайте каталог / datasource в корне вашего проекта.

Давайте создадим имитацию источника данных под названием sampleDatasource.js, чтобы проиллюстрировать, как использовать Apollo Datasource Rest.

const { RESTDataSource } = require('apollo-datasource-rest');
class SampleDatasource extends RESTDataSource{
constructor(){
        super();
        this.baseURL = '';
    }
async sampleData(){
        var data = {};
        data["data"] = "Hello World";
        return data;
    }
}
module.exports = SampleDatasource;

Затем давайте создадим источник данных для вызова API-интерфейсов SpaceX Rest, spacexDatasource.js

const { RESTDataSource } = require('apollo-datasource-rest');
class SpaceXDatasource extends RESTDataSource{
constructor(){
        super();
        this.baseURL = 'https://api.spacex.land/rest/'
    }
async rockets(){
        return this.get(`rockets?limit=10&offset=1`);
    }
}
module.exports = SpaceXDatasource;

Шаг 5. сопоставление запросов и типов

в корне вашего проекта создадим файл schema.graphql для сопоставления наших запросов и типов, связанных с нашими вызовами Rest API.

type Query{
    sampleData: SampleData
    rockets: [Rockets]
}
type SampleData{
    data: String!
}
type Rockets{
    id: String!
    name: String!
}

Шаг 6: собираем все вместе

Создайте файл index.js в корне вашего проекта.

const { ApolloServer } = require('apollo-server');
const { importSchema } = require('graphql-import');
const SampleDatasource = require('./datasource/sampleDatasource');
const SpaceXDatasource = require('./datasource/spacexDatasource');
const typeDefs = importSchema('./schema.graphql');
const resolvers = {
    Query: {
        sampleData: (root, _args, { dataSources }) => dataSources.sampleDatasource.sampleData(),
        rockets: (root, _args, { dataSources }) => dataSources.spacexDatasource.rockets()
    }
  };
const server = new ApolloServer({
    typeDefs,
    resolvers,
    dataSources: () => ({
       sampleDatasource: new SampleDatasource(),
       spacexDatasource: new SpaceXDatasource()
    })
  });
server.timeout = 0;
server.listen('9000').then(({ url }) => {
    console.log(`🚀 Server ready at ${url}`)
});

Шаг 7: запуск вашего проекта

Зайдите в терминал и запустите:

node index.js

Шаг 8: использование детской площадки

Откройте браузер и перейдите по адресу http: // localhost: 9000 /.

Вы можете использовать следующий запрос в левой части интерфейса:

query{
  sampleData{
   data
  }
  rockets{
    name
  }
}

Результат должен выглядеть как на картинке ниже:

Я надеюсь, это поможет вам. Если у вас есть какие-либо комментарии, не стесняйтесь комментировать ниже.