GraphQL на Node.js: Полное руководство по библиотеке graphql-http

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

GraphQL библиотека JavaScript (Node.js): graphql-http

GraphQL — это язык запросов для API, разработанный Facebook, который предоставляет клиентам возможность запрашивать только те данные, которые им нужны. В экосистеме Node.js одной из ключевых библиотек для реализации GraphQL-серверов является graphql-http. Это легковесный, но мощный инструмент, который позволяет создавать высокопроизводительные API с минимальными накладными расходами. В отличие от более тяжеловесных решений, таких как Apollo Server, graphql-http предлагает гибкость и полный контроль над HTTP-обработчиками.

Что такое graphql-http?

graphql-http — это официальная библиотека от сообщества GraphQL, которая предоставляет простой способ подключения GraphQL к любому HTTP-серверу Node.js. Она не зависит от конкретного фреймворка (Express, Koa, Fastify и т.д.), что делает её универсальным выбором. Основная задача библиотеки — взять входящий HTTP-запрос, распарсить его, выполнить GraphQL-запрос и вернуть структурированный ответ.

Установка и настройка

Для начала работы установите библиотеку через npm:

npm install graphql-http graphql

Минимальный пример сервера на чистом Node.js (без Express):

const http = require('http');
const { createHandler } = require('graphql-http');
const { buildSchema } = require('graphql');

// Определяем схему
const schema = buildSchema(`
  type Query {
    hello: String
    user(id: Int!): User
  }
  type User {
    id: Int
    name: String
    email: String
  }
`);

// Резолверы
const rootValue = {
  hello: () => 'Привет, мир!',
  user: ({ id }) => ({
    id,
    name: `Пользователь ${id}`,
    email: `user${id}@example.com`
  })
};

// Создаём обработчик
const handler = createHandler({ schema, rootValue });

// HTTP-сервер
const server = http.createServer((req, res) => {
  if (req.url === '/graphql') {
    handler(req, res);
  } else {
    res.writeHead(404);
    res.end('Not Found');
  }
});

server.listen(4000, () => {
  console.log('Сервер запущен на http://localhost:4000/graphql');
});

Интеграция с Express

Большинство разработчиков используют Express. Интеграция graphql-http с Express тривиальна:

const express = require('express');
const { createHandler } = require('graphql-http');
const { buildSchema } = require('graphql');

const schema = buildSchema(`
  type Query {
    books: [Book]
  }
  type Book {
    title: String
    author: String
  }
`);

const books = [
  { title: 'Война и мир', author: 'Лев Толстой' },
  { title: 'Преступление и наказание', author: 'Фёдор Достоевский' }
];

const rootValue = {
  books: () => books
};

const app = express();

app.all('/graphql', createHandler({ schema, rootValue }));

app.listen(3000, () => {
  console.log('Express + GraphQL на http://localhost:3000/graphql');
});

Основные возможности и преимущества

  • Гибкость маршрутизации: вы сами решаете, на каком эндпоинте будет доступен GraphQL.
  • Поддержка всех HTTP-методов: GET и POST запросы обрабатываются корректно.
  • Встроенная валидация: библиотека автоматически проверяет запросы на соответствие схеме.
  • Производительность: минимальное потребление памяти и высокая скорость обработки.
  • Расширяемость: можно добавлять middleware для аутентификации, логирования и кэширования.

Работа с мутациями и подписками

Помимо запросов (Query), graphql-http поддерживает мутации (Mutation) для изменения данных. Пример схемы с мутацией:

const schema = buildSchema(`
  type Query {
    message: String
  }
  type Mutation {
    setMessage(newMessage: String!): String
  }
`);

let message = 'Стартовое сообщение';

const rootValue = {
  message: () => message,
  setMessage: ({ newMessage }) => {
    message = newMessage;
    return message;
  }
};

Для подписок (Subscriptions) в реальном времени рекомендуется использовать WebSocket-библиотеки, такие как graphql-ws, но graphql-http отлично справляется с HTTP-запросами.

Обработка ошибок

Библиотека автоматически форматирует ошибки в стандартном GraphQL-формате. Вы можете кастомизировать обработку ошибок, передав функцию formatError:

const handler = createHandler({
  schema,
  rootValue,
  formatError: (err) => {
    console.error('Ошибка GraphQL:', err);
    return { message: 'Внутренняя ошибка сервера', code: 500 };
  }                    

Рекомендаций