Как отправлять HTTP-запросы в Node.js: полное руководство 2025 по fetch, axios и нативным модулям с примерами на TypeScript

Знакомство с 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 стоит использовать только в тех редких случаях, когда внешние зависимости абсолютно недопустимы.