Знакомство с Node.js немыслимо без умения отправлять HTTP-запросы. Это основа для взаимодействия с внешними API, создания бэкенда для веб-приложений и многого другого. Если вы новичок и хотите разобраться, как получать данные с серверов или отправлять их, это руководство для вас.

В этой статье мы рассмотрим самые популярные способы выполнения GET и POST запросов в Node.js, с простыми и рабочими примерами кода, включая варианты на TypeScript.

Полное руководство по HTTP-запросам в Node.js с примерами (fetch, axios)

Что такое GET и POST запросы?

Прежде чем мы начнем, давайте быстро разберемся в основах:

  • GET-запрос: Используется для получения данных с сервера. Когда вы вводите адрес сайта в браузере, вы отправляете GET-запрос. Вся необходимая информация передается прямо в URL.
  • POST-запрос: Используется для отправки данных на сервер для их создания или обновления. Например, когда вы заполняете форму регистрации на сайте и нажимаете “Отправить”, ваши данные уходят на сервер с помощью POST-запроса. Данные передаются в “теле” запроса, а не в URL.

Подготовка

Установите Node.js и пакетный менеджер npm. Для TypeScript потребуется также ts-node и typescript:

npm install -g ts-node typescript

Node-fetch

Начиная с версии Node.js 18, Fetch API доступен глобально, что делает его стандартным и удобным способом для выполнения запросов без установки сторонних библиотек. Синтаксис fetch основан на промисах и идеально сочетается с async/await.

Поддержка старой версии Node.js

Для Node.js v18+ установка не требуется. Для более старых версий:

npm install node-fetch

JavaScript

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data'); 
    if (!response.ok) throw new Error('Ошибка сети');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Ошибка:', error);
  }
}
fetchData();

TypeScript

TypeScript добавляет безопасность типов, что очень полезно при работе с API.

interface ApiResponse {
  id: number;
  name: string;
}

async function fetchData(): Promise<void> {
  try {
    const response = await fetch('https://api.example.com/data'); 
    if (!response.ok) throw new Error('Ошибка сети');
    const data: ApiResponse = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Ошибка:', error);
  }
}

Axios

Axios — это, пожалуй, самая популярная и удобная библиотека для HTTP-запросов. Она работает как в Node.js, так и в браузере, имеет простой синтаксис, автоматически преобразует JSON и лучше обрабатывает ошибки.

Установка
npm install axios

GET-запрос с помощью axios

Axios упрощает работу с промисами и предоставляет удобные методы.

JavaScript

const axios = require('axios');

async function getUsersWithAxios() {
  try {
    // .get() возвращает объект ответа, данные находятся в свойстве `data`
    const response = await axios.get('https://jsonplaceholder.typicode.com/users');
    console.log(response.data);
  } catch (error) {
    console.error('Не удалось получить пользователей:', error.message);
  }
}

getUsersWithAxios();

TypeScript

import axios from 'axios';

async function getUsersWithAxios() {
  try {
    // .get() возвращает объект ответа, данные находятся в свойстве `data`
    const response: { data: User[] } = await axios.get('https://jsonplaceholder.typicode.com/users');
    console.log(response.data);
  } catch (error) {
    console.error('Не удалось получить пользователей:', error.message);
  }
}

POST-запрос с помощью axios

axios автоматически преобразует наш объект в JSON и устанавливает нужные заголовки. Отлично интегрируется с TypeScript, позволяя типизировать и запрос, и ответ.

JavaScript

const axios = require('axios');

async function createPostWithAxios() {
  const newPost = {
    title: 'foo',
    body: 'bar',
    userId: 1,
  };

  try {
    // Вторым аргументом передаем данные
    const response = await axios.post('https://jsonplaceholder.typicode.com/posts', newPost);
    console.log('Пост успешно создан:', response.data);
  } catch (error) {
    console.error('Не удалось создать пост:', error.message);
  }
}

createPostWithAxios();

TypeScript

import axios, { AxiosResponse } from 'axios';

interface Post {
  id?: number;
  title: string;
  body: string;
  userId: number;
}

async function createPostWithAxiosTS(): Promise<void> {
  const newPost: Post = {
    title: 'TypeScript Post',
    body: 'This is a test.',
    userId: 5,
  };

  try {
    // Указываем тип ожидаемого ответа
    const response: AxiosResponse<Post> = await axios.post(
      'https://jsonplaceholder.typicode.com/posts', 
      newPost
    );
    console.log('Post created successfully:', response.data);
  } catch (error) {
    if (axios.isAxiosError(error)) {
      console.error('Failed to create post:', error.message);
    } else {
      console.error('An unexpected error occurred:', error);
    }
  }
}

createPostWithAxiosTS();
Другие методы (PUT, DELETE и т.д.)
// PUT-запрос
await axios.put('https://api.example.com/update/1',  { name: 'Bob' });

// DELETE-запрос
await axios.delete('https://api.example.com/delete/1'); 

Встроенный модуль https (без зависимостей)

Для тех, кто хочет избежать внешних зависимостей, в Node.js есть встроенные модули http и https. Они более низкоуровневые и менее удобные, но важно знать об их существовании.

Сделать GET-запрос с помощью встроенного модуля https не вызывает сложностей, но этот способ требует больше ручной работы, например, для сборки данных из потока.

const https = require('https');

function getUsersWithNativeHttp() {
  const options = {
    hostname: 'jsonplaceholder.typicode.com',
    path: '/users',
    method: 'GET',
  };

  const req = https.request(options, (res) => {
    let data = '';

    // Данные приходят частями (chunks)
    res.on('data', (chunk) => {
      data += chunk;
    });

    // Когда все части получены
    res.on('end', () => {
      console.log(JSON.parse(data));
    });
  });

  req.on('error', (error) => {
    console.error(error);
  });

  req.end(); // Завершаем запрос
}

getUsersWithNativeHttp();

Что лучше?

Сравнительный анализ популярных HTTP-клиентов в Node.js

Критерий

fetch (Node.js 18+)

axios

Модуль https

Установка

Не требуется (встроен)

npm install axios

Не требуется (встроен)

Простота

✅ Высокая✅ Очень высокая❌ Низкая

JSON

Ручное преобразование (.json())

✅ Автоматически❌ Ручное преобразование

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

Требует проверки response.ok

✅ Встроенная❌ Низкоуровневая

TypeScript

Хорошая поддержка

✅ Отличная поддержка

Требует ручной типизации

Лучше всего для

Быстрых скриптов, современных проектов

Большинства проектов

Простых запросов без зависимостей

Заключение

Для новичков в Node.js Axios является лучшей отправной точкой благодаря своей простоте, отличной документации и удобным функциям. Если вы работаете с современной версией Node.js (18+) и хотите избежать лишних зависимостей, встроенный fetch — это ваш выбор. Встроенный модуль https стоит использовать только в тех редких случаях, когда внешние зависимости абсолютно недопустимы.

👍 Партнёрский купон на все услуги
Промокод на все услуги Reg.ru
Скидка от 5% до 40% на любую из услуг REG.RU