Есть ли body в server response?

Ответ

Да, тело (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>').

Ответ 18+ 🔞

А, ну это ж классика, ёпта! Тело ответа в HTTP — это как раз та самая вкуснятина, которую сервер суёт клиенту в глотку. JSON там, HTML, файлы какие-нибудь — всё туда. В нативном 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' });
  // А вот тут уже формируем само тело — ту самую полезную нагрузку.
  const responseBody = JSON.stringify({ status: 'success', data: { id: 1 } });
  // И отправляем это всё нахуй клиенту, завершая ответ.
  res.end(responseBody);
});

server.listen(3000);

Важные моменты, чтобы не обосраться:

  1. Заголовки (writeHead) — это как пропуск на хату. Их надо показать до того, как начнёшь тащить внутрь мебель (тело). Иначе тебя просто не поймут, доверия ебать ноль.
  2. res.end() — это финальный аккорд, хлопок дверью. Он говорит: «Всё, мудила, получи своё и проваливай». Данные в него можно сразу передать, они улетят в тело.
  3. Если нужно отправить что-то овердохуища по размеру (типа видео), то можно чанками, через res.write(). Как будто кидаешь кому-то дохлую кошку по кускам.

Пример, где мы эту кошку кидаем по частям:

const fs = require('fs');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.write('Начинаем загрузку, не дёргайся...n');
  // Допустим, шлём пять кусков
  for (let i = 0; i < 5; i++) {
    res.write(`Кусок номер ${i}n`);
  }
  // Всё, пиздец, кончилось.
  res.end('Всё, получил свою дозу, свободен.');
});

Ну а в нормальных фреймворках, типа Express, это всё вообще в одну строку делается. res.json({ message: 'Привет' }) — и нет проблем, ядрёна вошь. Но под капотом-то всё равно то же самое.