JavaRush /Курсы /Модуль 4: Node.js, Next.js и Angular /Установка статус-кодов: re...

Установка статус-кодов: res.statusCode, res.setHeader

Модуль 4: Node.js, Next.js и Angular
4 уровень , 8 лекция
Открыта

1. Что такое HTTP-статус-код и зачем он нужен

Когда браузер (или любой другой клиент) делает запрос к вашему серверу, он ожидает не только данные, но и "отчёт" о том, как прошёл этот запрос. Для этого в HTTP-протоколе используются статус-коды — специальные числа, которые говорят о результате обработки запроса.

Например:

  • 200 — Всё хорошо, данные отправлены.
  • 404 — Ой, такой страницы нет.
  • 500 — Сервер что-то сломал внутри себя.

Если не указывать статус-код явно, Node.js по умолчанию отправляет 200 (успех) — но далеко не всегда это отражает реальное положение дел.

Аналогия:
Статус-код — это как смайлик в сообщении: можно написать "Ок", но если добавить 😡 или 😊, смысл сообщения меняется.

2. Как установить статус-код в Node.js

Всё просто: у объекта res (response), который вы получаете в обработчике запроса, есть свойство statusCode. По умолчанию оно равно 200.

Чтобы изменить статус-код, достаточно присвоить нужное значение:

res.statusCode = 404;

Важно:
Устанавливать статус-код нужно до того, как вы начали отправлять тело ответа (до res.end(), до записи в поток).

Пример: отправим 404, если страница не найдена

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/hello') {
    res.statusCode = 200; // Всё хорошо
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello, world!');
  } else {
    res.statusCode = 404; // Не найдено!
    res.setHeader('Content-Type', 'text/plain');
    res.end('Страница не найдена');
  }
});

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

Если вы зайдёте на /hello — увидите "Hello, world!" с кодом 200.
Если попробуете любой другой адрес — получите 404 и сообщение "Страница не найдена".

3. Популярные статус-коды: мини-таблица

Код Значение Когда использовать
200
OK Всё хорошо, данные отправлены
201
Created Ресурс создан (POST, PUT)
204
No Content Всё хорошо, но данных нет (например, DELETE)
301
Moved Permanently Постоянный редирект
302
Found Временный редирект
400
Bad Request Клиент отправил некорректный запрос
401
Unauthorized Требуется авторизация
403
Forbidden Доступ запрещён
404
Not Found Ресурс не найден
500
Internal Server Error Ошибка на сервере
503
Service Unavailable Сервер временно недоступен

Совет:
Если не уверены, какой статус-код выбрать — почти всегда можно начать с 200 (успех) или 404 (не найдено), а потом уточнить по ситуации.

4. Заголовки ответа: зачем нужны и как их устанавливать

Заголовки — это специальные "метки", которые идут в начале HTTP-ответа. Они сообщают клиенту важную информацию: тип данных, длину, правила кэширования и многое другое.

В Node.js для установки заголовков используется метод res.setHeader(name, value):

res.setHeader('Content-Type', 'application/json');

Самые нужные заголовки:

  • Content-Type — тип содержимого (например, text/html, application/json, text/plain)
  • Location — для редиректов (указывается новый адрес)
  • Cache-Control — управление кэшированием
  • Content-Length — длина тела ответа (обычно выставляется автоматически)

Пример: отправим JSON с правильным заголовком

const data = { message: 'Привет, JSON!' };
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify(data));

Если не указать Content-Type, браузер или клиент может не понять, что это JSON, и покажет "кашу" или просто текст.

5. Использование statusCode и setHeader вместе: практика

Объединим всё в пример — сделаем сервер, который "отвечает" разными статусами и типами данных:

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/json') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ success: true, data: [1, 2, 3] }));
  } else if (req.url === '/not-found') {
    res.statusCode = 404;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Ресурс не найден');
  } else if (req.url === '/redirect') {
    res.statusCode = 302;
    res.setHeader('Location', '/json');
    res.end();
  } else {
    res.statusCode = 400;
    res.setHeader('Content-Type', 'text/html');
    res.end('<h1>Некорректный запрос</h1>');
  }
});

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

Примечания:

  • /json — отдаёт JSON с кодом 200.
  • /not-found — отдаёт текст с кодом 404.
  • /redirect — делает редирект на /json с помощью кода 302 и заголовка Location.
  • Всё остальное — отдаёт 400 и HTML.

Попробуйте запустить сервер и поэкспериментировать с разными URL!

6. Полезные нюансы

Взаимодействие со статус-кодами в браузере и Postman

Когда вы делаете запрос из браузера или Postman, статус-код можно увидеть в панели Network (F12 → Network) или прямо в Postman. Это помогает отлаживать сервер: если на запрос к /not-found сервер возвращает 200, а не 404 — значит, вы что-то забыли в коде.

Совет:
Если сервер всегда возвращает 200, даже при ошибках, клиенту сложно понять, что что-то пошло не так. Используйте статус-коды по назначению!

Особенности и нюансы работы с res.statusCode и res.setHeader

  • Статус-код и заголовки должны быть установлены до отправки тела ответа (res.end() или первой записи в поток).
  • Если вы вызываете res.writeHead(statusCode, headers), это сразу устанавливает и статус, и заголовки (альтернативный способ, но чаще используют statusCode и setHeader).
  • После отправки заголовков (то есть после первой записи в поток) изменить их уже нельзя — попытка изменить вызовет ошибку, или просто проигнорируется.
  • Некоторые клиенты (например, браузеры) по-разному реагируют на один и тот же статус-код: например, на 301/302 браузер автоматически делает редирект, а на 404 — показывает свою "страницу ошибки", если тело ответа пустое.

7. Типичные ошибки при установке статус-кодов и заголовков

Ошибка №1:Установка statusCode после res.end()
Если вы попытаетесь изменить статус-код или заголовки после того, как уже вызвали res.end(), ничего не произойдёт — ответ уже ушёл в сеть. Всегда задавайте всё нужное до этого момента.

Ошибка №2: Не тот Content-Type
Если отправляете JSON, но забыли установить Content-Type: application/json, клиент может не распознать данные. Аналогично с HTML и plain text.

Ошибка №3: Всегда 200 OK
Новички часто забывают про статус-коды, и сервер всегда отвечает 200 — даже на ошибку. Это мешает клиенту (и вам!) правильно обрабатывать ошибки.

Ошибка №4: Несогласованность кода и тела ответа
Например, отправляете статус 404, но в теле ответа пишете "Успех!". Или наоборот — статус 200, а в теле ошибка. Старайтесь, чтобы статус-код и тело ответа были логически связаны.

Ошибка №5: Несвоевременная установка заголовков
Если вы начали писать тело ответа (res.write() или res.end()), а потом пытаетесь добавить заголовки — поздно, заголовки уже отправлены. Устанавливайте их заранее.

1
Задача
Модуль 4: Node.js, Next.js и Angular, 4 уровень, 8 лекция
Недоступна
Отдача страницы с ошибкой 404
Отдача страницы с ошибкой 404
1
Задача
Модуль 4: Node.js, Next.js и Angular, 4 уровень, 8 лекция
Недоступна
Обработка JSON, HTML и редиректа с разными кодами
Обработка JSON, HTML и редиректа с разными кодами
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ