Apollo Server: детальний розбір та ключові аспекти роботи

Що таке Apollo Server?

Apollo Server — це гнучкий, потужний сервер GraphQL, який дозволяє створювати API, використовуючи GraphQL. Він працює як проміжний рівень між клієнтом та бекендом (базами даних, мікросервісами, REST API тощо).

Це безсерверний і екстенсибельний сервер, що підтримує Node.js, інтегрується з багатьма фреймворками та платформами, такими як Express, Koa, Fastify, а також з серверless-інфраструктурою.


Як працює Apollo Server?

Apollo Server працює за принципом запит-відповідь, де клієнт відправляє GraphQL-запит, а сервер обробляє його, звертаючись до джерел даних (база даних, REST API, файли тощо), і повертає відповідь у формі JSON.

Основні компоненти Apollo Server

  1. Схема (Schema)
    • Визначає типи даних (типи, запити, мутації та підписки).
    • Створюється за допомогою GraphQL Schema Definition Language (SDL).
  2. Резолвери (Resolvers)
    • Функції, які обробляють логіку запитів.
    • Визначають, як сервер отримує та обробляє дані.
  3. Контекст (Context)
    • Передає глобальні змінні, наприклад, автентифікаційні дані користувача.
  4. Джерела даних (Data Sources)
    • REST API, бази даних (PostgreSQL, MongoDB, MySQL), файли або інші GraphQL-сервери.
  5. GraphQL Playground / Apollo Studio
    • Інструменти для тестування та відладки API.

Встановлення та базове налаштування Apollo Server

Для встановлення Apollo Server необхідно мати Node.js та пакетний менеджер npm/yarn/pnpm.

1. Встановлення пакунків

npm install @apollo/server graphql

Або:

yarn add @apollo/server graphql

2. Створення простого сервера

import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";

// Визначення схеми
const typeDefs = `
  type Query {
    hello: String
  }
`;

// Визначення резолверів
const resolvers = {
  Query: {
    hello: () => "Привіт, світ!",
  },
};

// Створення сервера
const server = new ApolloServer({ typeDefs, resolvers });

// Запуск сервера
startStandaloneServer(server, { listen: { port: 4000 } }).then(({ url }) => {
  console.log(`🚀 Сервер запущено за адресою: ${url}`);
});

Пояснення коду:

  • Оголошуємо GraphQL-схему (тільки один запит hello).
  • Визначаємо резолвер, який повертає "Привіт, світ!".
  • Запускаємо сервер на порту 4000.

Розширені можливості Apollo Server

1. Використання контексту (автентифікація)

Контекст дозволяє передавати глобальні дані, наприклад, токен авторизації:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: async ({ req }) => {
    const token = req.headers.authorization || "";
    return { user: token ? decodeToken(token) : null };
  },
});

2. Запити до бази даних

Використання MongoDB через Mongoose:

import mongoose from "mongoose";

await mongoose.connect("mongodb://localhost:27017/mydb");

const UserSchema = new mongoose.Schema({ name: String });
const User = mongoose.model("User", UserSchema);

const resolvers = {
  Query: {
    users: async () => await User.find(),
  },
};

3. Підключення REST API

Apollo Server може отримувати дані з REST API за допомогою RESTDataSource:

import { RESTDataSource } from "@apollo/datasource-rest";

class UsersAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = "https://jsonplaceholder.typicode.com/";
  }

  async getUsers() {
    return this.get("users");
  }
}

const resolvers = {
  Query: {
    users: async (_, __, { dataSources }) => dataSources.usersAPI.getUsers(),
  },
};

У сервері потрібно передати цей клас як джерело даних:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  dataSources: () => ({
    usersAPI: new UsersAPI(),
  }),
});

Оптимізація та розширення Apollo Server

1. Використання кешування

Кешування допомагає зменшити навантаження на сервер:

const server = new ApolloServer({
  cache: "bounded", // Вбудоване кешування Apollo
});

Можна також використовувати Redis для збереження кешу.

2. Використання підписок (Subscriptions)

Apollo підтримує WebSocket-з’єднання для реального часу:

import { ApolloServer } from "@apollo/server";
import { PubSub } from "graphql-subscriptions";

const pubsub = new PubSub();
const MESSAGE_ADDED = "MESSAGE_ADDED";

const typeDefs = `
  type Message {
    id: ID!
    content: String!
  }

  type Query {
    messages: [Message]
  }

  type Mutation {
    addMessage(content: String!): Message
  }

  type Subscription {
    messageAdded: Message
  }
`;

const messages = [];

const resolvers = {
  Query: {
    messages: () => messages,
  },
  Mutation: {
    addMessage: (_, { content }) => {
      const message = { id: messages.length, content };
      messages.push(message);
      pubsub.publish(MESSAGE_ADDED, { messageAdded: message });
      return message;
    },
  },
  Subscription: {
    messageAdded: {
      subscribe: () => pubsub.asyncIterator([MESSAGE_ADDED]),
    },
  },
};

Підписки використовують WebSockets, тому потрібні додаткові налаштування для сервера.


Висновки

Apollo Server — це гнучкий і потужний інструмент для створення GraphQL API, який дозволяє легко інтегрувати бази даних, REST API та інші джерела.

Що потрібно знати?

✅ Основи GraphQL: запити, мутації, підписки
✅ Як працюють схеми, резолвери та контекст
✅ Інтеграція з базами даних (MongoDB, PostgreSQL)
✅ Використання автентифікації та кешування
✅ Підтримка реального часу через WebSockets

З Apollo Server можна створювати масштабовані та продуктивні API, що ідеально підходять для сучасних веб- і мобільних додатків! 🚀

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *