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. Популярные статус-коды: мини-таблица
| Код | Значение | Когда использовать |
|---|---|---|
|
OK | Всё хорошо, данные отправлены |
|
Created | Ресурс создан (POST, PUT) |
|
No Content | Всё хорошо, но данных нет (например, DELETE) |
|
Moved Permanently | Постоянный редирект |
|
Found | Временный редирект |
|
Bad Request | Клиент отправил некорректный запрос |
|
Unauthorized | Требуется авторизация |
|
Forbidden | Доступ запрещён |
|
Not Found | Ресурс не найден |
|
Internal Server Error | Ошибка на сервере |
|
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()), а потом пытаетесь добавить заголовки — поздно, заголовки уже отправлены. Устанавливайте их заранее.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ