Есть ли body в server response?

«Есть ли body в server response?» — вопрос из категории Сети, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, тело (body) HTTP-ответа — это стандартная часть, предназначенная для передачи данных клиенту: JSON, HTML, XML, файлы и т.д. В Node.js, при работе с нативным модулем http, тело ответа формируется с помощью методов response.write() и завершается response.end().

Базовый пример с модулем http:

const http = require('http');

const server = http.createServer((req, res) => {
  // Устанавливаем заголовки
  res.writeHead(200, { 'Content-Type': 'application/json' });
  // Записываем тело ответа (body) в формате JSON
  const responseBody = JSON.stringify({ status: 'success', data: { id: 1 } });
  res.end(responseBody);
});

server.listen(3000);

Ключевые моменты:

  1. Заголовки (writeHead) должны быть установлены до записи тела.
  2. Метод res.end() сигнализирует о завершении формирования ответа. Любые данные, переданные в него, также записываются в тело.
  3. Для потоковой передачи больших данных (например, видеофайла) можно использовать res.write() несколько раз перед res.end().

Пример потоковой отправки:

const fs = require('fs');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.write('Starting data transfer...n');
  // Симулируем отправку чанков
  for (let i = 0; i < 5; i++) {
    res.write(`Chunk ${i}n`);
  }
  res.end('Transfer complete.');
});

В современных фреймворках (Express, Fastify, Koa) тело ответа формируется проще, например, в Express: res.json({ message: 'Hello' }) или res.send('<html>...</html>').