Spec-Zone.ru › Node.js 22 LTS

HTTP

Стабильность: 2 - Стабильный

Исходный код: lib/http.js

Этот модуль, содержащий как клиент, так и сервер, можно импортировать с помощью require('node:http') (CommonJS) или import * as http from 'node:http' (модуль ES).

Интерфейсы HTTP в Node.js разработаны для поддержки множества возможностей протокола, которые традиционно было сложно использовать. В частности, это большие сообщения, возможно, закодированные с помощью сегментирования. Интерфейс устроен так, чтобы никогда не буферизировать запросы или ответы целиком, благодаря чему пользователь может передавать данные потоком.

Заголовки HTTP-сообщений представлены объектом следующего вида:

{ "content-length": "123",
  "content-type": "text/plain",
  "connection": "keep-alive",
  "host": "example.com",
  "accept": "*/*" } copy

Ключи переводятся в нижний регистр. Значения не изменяются.

Чтобы поддерживать весь спектр возможных HTTP-приложений, API HTTP в Node.js имеет очень низкий уровень абстракции. Он отвечает только за обработку потоков и разбор сообщений. Он разбирает сообщение на заголовки и тело, но не анализирует сами заголовки или тело.

Подробные сведения об обработке дублирующихся заголовков см. в разделе message.headers.

Исходные заголовки в полученном виде сохраняются в свойстве rawHeaders, которое представляет собой массив значений [key, value, key2, value2, ...]. Например, для предыдущего объекта заголовков сообщения список rawHeaders может выглядеть так:

[ 'ConTent-Length', '123456',
  'content-LENGTH', '123',
  'content-type', 'text/plain',
  'CONNECTION', 'keep-alive',
  'Host', 'example.com',
  'accepT', '*/*' ] copy

Класс: http.Agent

Добавлено в: v0.3.4

Объект Agent отвечает за управление постоянством и повторным использованием соединений для HTTP-клиентов. Он поддерживает очередь ожидающих запросов для заданных узла и порта, повторно используя для каждого из них одно соединение сокета, пока очередь не опустеет. После этого сокет либо уничтожается, либо помещается в пул, где хранится для повторного использования при запросах к тому же узлу и порту. Уничтожение или помещение в пул зависит от параметра keepAlive.

Для соединений в пуле включен TCP Keep-Alive, но серверы всё равно могут закрывать неактивные соединения. В этом случае они будут удалены из пула, а при новом HTTP-запросе к этому узлу и порту будет установлено новое соединение. Серверы также могут запрещать несколько запросов через одно соединение; тогда соединение придется устанавливать заново для каждого запроса, и его нельзя будет поместить в пул. Объект Agent всё равно будет выполнять запросы к этому серверу, но каждый из них будет выполняться через новое соединение.

Когда клиент или сервер закрывает соединение, оно удаляется из пула. Ссылки на неиспользуемые сокеты в пуле будут сняты, чтобы процесс Node.js не продолжал работать при отсутствии незавершенных запросов (см. socket.unref()).

Рекомендуется destroy() экземпляр Agent, когда он больше не используется, поскольку неиспользуемые сокеты занимают ресурсы ОС.

Сокеты удаляются из агента, когда они генерируют событие 'close' или 'agentRemove'. Если требуется надолго оставить открытым один HTTP-запрос, не сохраняя его в агенте, можно сделать примерно следующее:

http.get(options, (res) => {
  // Do stuff
}).on('socket', (socket) => {
  socket.emit('agentRemove');
}); copy

Агент также можно использовать для отдельного запроса. Если передать {agent: false} в качестве параметра функциям http.get() или http.request(), для соединения с клиентом будет использован одноразовый Agent с параметрами по умолчанию.

agent:false:

http.get({
  hostname: 'localhost',
  port: 80,
  path: '/',
  agent: false,  // Create a new agent just for this one request
}, (res) => {
  // Do stuff with response
}); copy

new Agent([options])

История
Версия Изменения
v22.20.0

Добавлена поддержка agentKeepAliveTimeoutBuffer.

v15.6.0, v14.17.0

Планирование по умолчанию изменено с 'fifo' на 'lifo'.

v14.5.0, v12.20.0

Добавлен параметр scheduling для указания стратегии планирования свободных сокетов.

v14.5.0, v12.19.0

В конструктор агента добавлен параметр maxTotalSockets.

v0.3.4

Добавлено в: v0.3.4

  • options <Object> Набор настраиваемых параметров агента. Может содержать следующие поля:
    • keepAlive <boolean> Сохранять сокеты открытыми, даже если нет незавершенных запросов, чтобы их можно было использовать для последующих запросов без повторного установки TCP-соединения. Не следует путать с значением keep-alive заголовка Connection. Заголовок Connection: keep-alive всегда отправляется при использовании агента, за исключением случаев, когда явно указан заголовок Connection или параметры keepAlive и maxSockets соответственно заданы как false и Infinity; в этом случае будет использоваться Connection: close. По умолчанию: false.
    • keepAliveMsecs <number> При использовании параметра keepAlive задает начальную задержку перед отправкой пакетов TCP Keep-Alive. Игнорируется, если параметр keepAlive имеет значение false или undefined. По умолчанию: 1000.
    • agentKeepAliveTimeoutBuffer <number> Количество миллисекунд, вычитаемое из подсказки keep-alive: timeout=..., предоставленной сервером, при определении времени истечения срока действия сокета. Этот запас помогает агенту закрывать сокет немного раньше сервера и снижает вероятность отправки запроса через сокет, который сервер собирается закрыть. По умолчанию: 1000.
    • maxSockets <number> Максимальное количество сокетов для одного узла. Если один и тот же узел открывает несколько одновременных соединений, для каждого запроса будет использоваться новый сокет, пока не будет достигнуто значение maxSockets. Если узел попытается открыть больше соединений, чем указано в maxSockets, дополнительные запросы попадут в очередь ожидания и перейдут в активное состояние соединения, когда завершится существующее соединение. Это гарантирует, что в любой момент времени для данного узла будет не более maxSockets активных соединений. По умолчанию: Infinity.
    • maxTotalSockets <number> Максимальное общее количество сокетов для всех узлов. Для каждого запроса будет использоваться новый сокет, пока не будет достигнуто максимальное значение. По умолчанию: Infinity.
    • maxFreeSockets <number> Максимальное количество сокетов для одного узла, которые могут оставаться открытыми в свободном состоянии. Имеет значение, только если keepAlive задан как true. По умолчанию: 256.
    • scheduling <string> Стратегия планирования, применяемая при выборе следующего свободного сокета. Возможны значения 'fifo' и 'lifo'. Главное различие между этими стратегиями планирования состоит в том, что 'lifo' выбирает сокет, использовавшийся недавно, а 'fifo' — сокет, использовавшийся давно. При низкой частоте запросов в секунду планирование 'lifo' снижает вероятность выбора сокета, который сервер мог закрыть из-за бездействия. При высокой частоте запросов в секунду планирование 'fifo' позволяет максимально увеличить количество открытых сокетов, а планирование 'lifo' — свести его к минимуму. По умолчанию: 'lifo'.
    • timeout <number> Тайм-аут сокета в миллисекундах. Это значение задает тайм-аут при создании сокета.

Также поддерживаются options из socket.connect().

Чтобы настроить любой из этих параметров, необходимо создать пользовательский экземпляр http.Agent.

Модули JavaScript
import { Agent, request } from 'node:http';
const keepAliveAgent = new Agent({ keepAlive: true });
options.agent = keepAliveAgent;
request(options, onResponseCallback);
CommonJS
const http = require('node:http');
const keepAliveAgent = new http.Agent({ keepAlive: true });
options.agent = keepAliveAgent;
http.request(options, onResponseCallback);

agent.createConnection(options[, callback])

Добавлено в: v0.11.4
  • options <Object> Параметры с данными о соединении. Формат параметров см. в разделе net.createConnection()
  • callback <Function> Функция обратного вызова, получающая созданный сокет
  • Возвращает: <stream.Duplex>

Создает сокет/поток для использования в HTTP-запросах.

По умолчанию эта функция совпадает с net.createConnection(). Однако при необходимости более гибкой настройки пользовательские агенты могут переопределить этот метод.

Сокет/поток можно предоставить одним из двух способов: вернуть его из этой функции или передать в callback.

Гарантируется, что этот метод вернет экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не укажет тип сокета, отличный от <net.Socket>.

Сигнатура callback: (err, stream).

agent.keepSocketAlive(socket)

Добавлено в: v8.1.0
  • socket <stream.Duplex>

Вызывается, когда socket отсоединяется от запроса и может быть сохранен объектом Agent. По умолчанию выполняются следующие действия:

socket.setKeepAlive(true, this.keepAliveMsecs);
socket.unref();
return true; copy

Этот метод можно переопределить в конкретном подклассе Agent. Если метод возвращает ложное значение, сокет будет уничтожен, а не сохранен для использования со следующим запросом.

Аргумент socket может быть экземпляром <net.Socket>, подкласса <stream.Duplex>.

agent.reuseSocket(socket, request)

Добавлено в: v8.1.0
  • socket <stream.Duplex>
  • request <http.ClientRequest>

Вызывается, когда socket присоединяется к request после сохранения благодаря параметрам keep-alive. По умолчанию выполняются следующие действия:

socket.ref(); copy

Этот метод можно переопределить в конкретном подклассе Agent.

Аргумент socket может быть экземпляром <net.Socket>, подкласса <stream.Duplex>.

agent.destroy()

Добавлено в: v0.11.4

Уничтожает все сокеты, используемые в данный момент агентом.

Обычно в этом нет необходимости. Однако при использовании агента с включенным keepAlive рекомендуется явно остановить агент, когда он больше не нужен. В противном случае сокеты могут оставаться открытыми довольно долго, пока сервер не закроет их.

agent.freeSockets

История
Версия Изменения
v16.0.0

Теперь у свойства прототип null.

v0.11.4

Добавлено в: v0.11.4

  • Тип: <Object>

Объект, содержащий массивы сокетов, ожидающих использования агентом, если включен параметр keepAlive. Не изменяйте его.

Сокеты в списке freeSockets будут автоматически уничтожаться и удаляться из массива при событии 'timeout'.

agent.getName([options])

История
Версия Изменения
v17.7.0, v16.15.0

Параметр options теперь необязателен.

v0.11.4

Добавлено в: v0.11.4

  • options <Object> Набор параметров, предоставляющих сведения для формирования имени
    • host <string> Доменное имя или IP-адрес сервера, которому будет отправлен запрос
    • port <number> Порт удаленного сервера
    • localAddress <string> Локальный интерфейс для привязки сетевых соединений при отправке запроса
    • family <integer> Должно быть равно 4 или 6, если это значение не равно undefined.
  • Возвращает: <string>

Возвращает уникальное имя для набора параметров запроса, чтобы определить, можно ли повторно использовать соединение. Для HTTP-агента возвращается host:port:localAddress или host:port:localAddress:family. Для HTTPS-агента имя включает CA, сертификат, шифры и другие параметры, специфичные для HTTPS/TLS, от которых зависит возможность повторного использования сокета.

agent.maxFreeSockets

Добавлено в: v0.11.7
  • Тип: <number>

По умолчанию равно 256. Для агентов с включенным keepAlive задает максимальное количество сокетов, которые останутся открытыми в свободном состоянии.

agent.maxSockets

Добавлено в: v0.3.6
  • Тип: <number>

По умолчанию равно Infinity. Определяет, сколько одновременных сокетов агент может открыть для одного источника. Источник — это значение, возвращаемое функцией agent.getName().

agent.maxTotalSockets

Добавлено в: v14.5.0, v12.19.0
  • Тип: <number>

По умолчанию равно Infinity. Определяет, сколько одновременных сокетов агент может открыть. В отличие от maxSockets, этот параметр применяется ко всем источникам.

agent.requests

История
Версия Изменения
v16.0.0

Теперь у свойства прототип null.

v0.5.9

Добавлено в: v0.5.9

  • Тип: <Object>

Объект, содержащий очереди запросов, которым еще не назначены сокеты. Не изменяйте его.

agent.sockets

История
Версия Изменения
v16.0.0

Теперь у свойства прототип null.

v0.3.6

Добавлено в: v0.3.6

  • Тип: <Object>

Объект, содержащий массивы сокетов, используемых в данный момент агентом. Не изменяйте его.

Класс: http.ClientRequest

Добавлено в: v0.1.17
  • Расширяет: <http.OutgoingMessage>

Этот объект создается внутри системы и возвращается из http.request(). Он представляет выполняющийся запрос, заголовок которого уже поставлен в очередь. Заголовок по-прежнему можно изменять с помощью API setHeader(name, value), getHeader(name), removeHeader(name). Фактически заголовок будет отправлен вместе с первым фрагментом данных или при вызове request.end().

Чтобы получить ответ, добавьте к объекту запроса обработчик события 'response'. Событие 'response' будет сгенерировано объектом запроса после получения заголовков ответа. Обработчик события 'response' вызывается с одним аргументом — экземпляром http.IncomingMessage.

Во время события 'response' к объекту ответа можно добавить обработчики; в частности, чтобы прослушивать событие 'data'.

Если обработчик 'response' не добавлен, ответ будет полностью отброшен. Однако если добавлен обработчик события 'response', данные объекта ответа необходимо считывать: либо вызывая response.read() при каждом событии 'readable', либо добавив обработчик 'data', либо вызвав метод .resume(). Пока данные не будут считаны, событие 'end' не будет вызвано. Кроме того, пока данные не считаны, они будут занимать память, что в конечном итоге может привести к ошибке «process out of memory».

Для обеспечения обратной совместимости res будет генерировать 'error', только если зарегистрирован обработчик 'error'.

Задайте заголовок Content-Length, чтобы ограничить размер тела ответа. Если response.strictContentLength имеет значение true, несовпадение со значением заголовка Content-Length приведет к выбрасыванию Error с кодом code: 'ERR_HTTP_CONTENT_LENGTH_MISMATCH'.

Значение Content-Length должно быть указано в байтах, а не в символах. Используйте Buffer.byteLength(), чтобы определить длину тела в байтах.

Событие: 'abort'

Добавлено в: v1.4.1Устарело с: v17.0.0, v16.12.0
Стабильность: 0 — Устарело. Вместо этого прослушивайте событие 'close'.

Вызывается, когда клиент прерывает запрос. Это событие генерируется только при первом вызове abort().

Событие: 'close'

Добавлено в: v0.5.4

Указывает, что запрос завершен или базовое соединение было преждевременно прервано (до завершения ответа).

Событие: 'connect'

Добавлено в: v0.7.0
  • response <http.IncomingMessage>
  • socket <stream.Duplex>
  • head <Buffer>

Вызывается каждый раз, когда сервер отвечает на запрос методом CONNECT. Если это событие не прослушивается, соединения клиентов, получивших метод CONNECT, будут закрыты.

В качестве аргумента этого события гарантированно передается экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

Пример клиента и сервера, демонстрирующий прослушивание события 'connect':

Модули JavaScript
import { createServer, request } from 'node:http';
import { connect } from 'node:net';
import { URL } from 'node:url';

// Create an HTTP tunneling proxy
const proxy = createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
proxy.on('connect', (req, clientSocket, head) => {
  // Connect to an origin server
  const { port, hostname } = new URL(`http://${req.url}`);
  const serverSocket = connect(port || 80, hostname, () => {
    clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    serverSocket.write(head);
    serverSocket.pipe(clientSocket);
    clientSocket.pipe(serverSocket);
  });
});

// Now that proxy is running
proxy.listen(1337, '127.0.0.1', () => {

  // Make a request to a tunneling proxy
  const options = {
    port: 1337,
    host: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80',
  };

  const req = request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
    console.log('got connected!');

    // Make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    socket.on('end', () => {
      proxy.close();
    });
  });
});
CommonJS
const http = require('node:http');
const net = require('node:net');
const { URL } = require('node:url');

// Create an HTTP tunneling proxy
const proxy = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
proxy.on('connect', (req, clientSocket, head) => {
  // Connect to an origin server
  const { port, hostname } = new URL(`http://${req.url}`);
  const serverSocket = net.connect(port || 80, hostname, () => {
    clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    serverSocket.write(head);
    serverSocket.pipe(clientSocket);
    clientSocket.pipe(serverSocket);
  });
});

// Now that proxy is running
proxy.listen(1337, '127.0.0.1', () => {

  // Make a request to a tunneling proxy
  const options = {
    port: 1337,
    host: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80',
  };

  const req = http.request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
    console.log('got connected!');

    // Make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    socket.on('end', () => {
      proxy.close();
    });
  });
});

Событие: 'continue'

Добавлено в: v0.3.2

Вызывается, когда сервер отправляет HTTP-ответ «100 Continue», обычно потому, что запрос содержал «Expect: 100-continue». Это указание клиенту отправить тело запроса.

Событие: 'finish'

Добавлено в: v0.3.6

Вызывается после отправки запроса. Точнее, это событие генерируется, когда последний фрагмент заголовков и тела ответа передан операционной системе для отправки по сети. Это не означает, что сервер уже что-либо получил.

Событие: 'information'

Добавлено в: v10.0.0
  • info <Object>
    • httpVersion <string>
    • httpVersionMajor <integer>
    • httpVersionMinor <integer>
    • statusCode <integer>
    • statusMessage <string>
    • headers <Object>
    • rawHeaders <string[]>

Вызывается, когда сервер отправляет промежуточный ответ 1xx (за исключением 101 Upgrade). Обработчикам этого события передается объект, содержащий версию HTTP, код состояния, сообщение о состоянии, объект заголовков «ключ-значение» и массив с исходными именами заголовков, за которыми следуют соответствующие значения.

Модули JavaScript
import { request } from 'node:http';

const options = {
  host: '127.0.0.1',
  port: 8080,
  path: '/length_request',
};

// Make a request
const req = request(options);
req.end();

req.on('information', (info) => {
  console.log(`Got information prior to main response: ${info.statusCode}`);
});
CommonJS
const http = require('node:http');

const options = {
  host: '127.0.0.1',
  port: 8080,
  path: '/length_request',
};

// Make a request
const req = http.request(options);
req.end();

req.on('information', (info) => {
  console.log(`Got information prior to main response: ${info.statusCode}`);
});

Для статусов 101 Upgrade это событие не генерируется, поскольку они выходят за рамки традиционной цепочки HTTP-запроса/ответа, например в случае веб-сокетов, обновления TLS на месте или HTTP 2.0. Чтобы получать уведомления о статусах 101 Upgrade, прослушивайте событие 'upgrade'.

Событие: 'response'

Добавлено в: v0.1.0
  • response <http.IncomingMessage>

Вызывается при получении ответа на этот запрос. Это событие генерируется только один раз.

Событие: 'socket'

Добавлено в: v0.5.3
  • socket <stream.Duplex>

В качестве аргумента этого события гарантированно передается экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

Событие: 'timeout'

Добавлено в: v0.7.8

Вызывается, когда время ожидания бездействия базового сокета истекает. Это лишь означает, что сокет бездействовал. Запрос необходимо уничтожить вручную.

См. также: request.setTimeout().

Событие: 'upgrade'

Добавлено в: v0.1.94
  • response <http.IncomingMessage>
  • socket <stream.Duplex>
  • head <Buffer>

Вызывается каждый раз, когда сервер отвечает на запрос обновлением протокола. Если это событие не прослушивается и код состояния ответа — 101 Switching Protocols, соединения клиентов, получивших заголовок обновления, будут закрыты.

В качестве аргумента этого события гарантированно передается экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

Пример пары клиент-сервер, демонстрирующий прослушивание события 'upgrade'.

Модули JavaScript
import http from 'node:http';
import process from 'node:process';

// Create an HTTP server
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
server.on('upgrade', (req, socket, head) => {
  socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
               'Upgrade: WebSocket\r\n' +
               'Connection: Upgrade\r\n' +
               '\r\n');

  socket.pipe(socket); // echo back
});

// Now that server is running
server.listen(1337, '127.0.0.1', () => {

  // make a request
  const options = {
    port: 1337,
    host: '127.0.0.1',
    headers: {
      'Connection': 'Upgrade',
      'Upgrade': 'websocket',
    },
  };

  const req = http.request(options);
  req.end();

  req.on('upgrade', (res, socket, upgradeHead) => {
    console.log('got upgraded!');
    socket.end();
    process.exit(0);
  });
});
CommonJS
const http = require('node:http');

// Create an HTTP server
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
server.on('upgrade', (req, socket, head) => {
  socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
               'Upgrade: WebSocket\r\n' +
               'Connection: Upgrade\r\n' +
               '\r\n');

  socket.pipe(socket); // echo back
});

// Now that server is running
server.listen(1337, '127.0.0.1', () => {

  // make a request
  const options = {
    port: 1337,
    host: '127.0.0.1',
    headers: {
      'Connection': 'Upgrade',
      'Upgrade': 'websocket',
    },
  };

  const req = http.request(options);
  req.end();

  req.on('upgrade', (res, socket, upgradeHead) => {
    console.log('got upgraded!');
    socket.end();
    process.exit(0);
  });
});

request.abort()

Добавлено в: v0.3.8Устарело с: v14.1.0, v13.14.0
Стабильность: 0 — Устарело: вместо этого используйте request.destroy().

Помечает запрос как прерываемый. Вызов этого метода приведет к отбрасыванию оставшихся данных ответа и уничтожению сокета.

request.aborted

История
Версия Изменения
v17.0.0, v16.12.0

Устарело с: v17.0.0, v16.12.0

v11.0.0

Свойство aborted больше не является числовой меткой времени.

v0.11.14

Добавлено в: v0.11.14

Стабильность: 0 — Устарело. Вместо этого проверьте request.destroyed.
  • Тип: <boolean>

Значение свойства request.aborted будет true, если запрос был прерван.

request.connection

Добавлено в: v0.3.0Устарело с: v13.0.0
Стабильность: 0 — Устарело. Используйте request.socket.
  • Тип: <stream.Duplex>

См. request.socket.

request.cork()

Добавлено в: v13.2.0, v12.16.0

См. writable.cork().

request.end([data[, encoding]][, callback])

История
Версия Изменения
v15.0.0

Параметр data теперь может иметь тип Uint8Array.

v10.0.0

Теперь этот метод возвращает ссылку на ClientRequest.

v0.1.90

Добавлено в: v0.1.90

  • data <string> | <Buffer> | <Uint8Array>
  • encoding <string>
  • callback <Function>
  • Возвращает: <this>

Завершает отправку запроса. Если какие-либо части тела еще не отправлены, они будут переданы в поток. Если запрос использует фрагментированную передачу, будет отправлен завершающий '0\r\n\r\n'.

Если указано data, это эквивалентно вызову request.write(data, encoding), за которым следует request.end(callback).

Если указано callback, оно будет вызвано после завершения потока запроса.

request.destroy([error])

История
Версия Изменения
v14.5.0

Для согласованности с другими потоками Readable функция возвращает this.

v0.3.0

Добавлено в: v0.3.0

  • error <Error> Необязательно: ошибка, передаваемая вместе с событием 'error'.
  • Возвращает: <this>

Уничтожает запрос. При необходимости генерирует событие 'error' и генерирует событие 'close'. Вызов этого метода приведет к отбрасыванию оставшихся данных ответа и уничтожению сокета.

Дополнительные сведения см. в разделе writable.destroy().

request.destroyed
Добавлено в: v14.1.0, v13.14.0
  • Тип: <boolean>

Равно true после вызова request.destroy().

Дополнительные сведения см. в разделе writable.destroyed.

request.finished

Добавлено в: v0.0.1Устарело с: v13.4.0, v12.16.0
Стабильность: 0 — Устарело. Используйте request.writableEnded.
  • Тип: <boolean>

Значение свойства request.finished будет true, если был вызван метод request.end(). request.end() будет вызван автоматически, если запрос был инициирован с помощью http.get().

request.flushHeaders()

Добавлено в: v1.6.0

Сбрасывает заголовки запроса.

Для повышения эффективности Node.js обычно буферизует заголовки запроса до вызова request.end() или записи первого фрагмента данных запроса. Затем Node.js пытается объединить заголовки и данные запроса в один пакет TCP.

Обычно это желательно (так сокращается количество циклов обмена данными TCP), но не в тех случаях, когда первые данные отправляются значительно позже. request.flushHeaders() отменяет оптимизацию и инициирует отправку запроса.

request.getHeader(name)

Добавлено в: v1.6.0
  • name <string>
  • Возвращает: <any>

Считывает заголовок запроса. Регистр имени не учитывается. Тип возвращаемого значения зависит от аргументов, переданных в request.setHeader().

request.setHeader('content-type', 'text/html');
request.setHeader('Content-Length', Buffer.byteLength(body));
request.setHeader('Cookie', ['type=ninja', 'language=javascript']);
const contentType = request.getHeader('Content-Type');
// 'contentType' is 'text/html'
const contentLength = request.getHeader('Content-Length');
// 'contentLength' is of type number
const cookie = request.getHeader('Cookie');
// 'cookie' is of type string[] copy

request.getHeaderNames()

Добавлено в: v7.7.0
  • Возвращает: <string[]>

Возвращает массив с уникальными именами текущих исходящих заголовков. Все имена заголовков записаны строчными буквами.

request.setHeader('Foo', 'bar');
request.setHeader('Cookie', ['foo=bar', 'bar=baz']);

const headerNames = request.getHeaderNames();
// headerNames === ['foo', 'cookie'] copy

request.getHeaders()

Добавлено в: v7.7.0
  • Возвращает: <Object>

Возвращает поверхностную копию текущих исходящих заголовков. Поскольку используется поверхностная копия, значения-массивы можно изменять без дополнительных вызовов различных методов модуля http, связанных с заголовками. Ключами возвращаемого объекта являются имена заголовков, а значениями — соответствующие значения заголовков. Все имена заголовков записаны строчными буквами.

Объект, возвращаемый методом request.getHeaders(), не наследует прототип от JavaScript-объекта Object. Это означает, что стандартные методы Object, такие как obj.toString(), obj.hasOwnProperty() и другие, не определены и не будут работать.

request.setHeader('Foo', 'bar');
request.setHeader('Cookie', ['foo=bar', 'bar=baz']);

const headers = request.getHeaders();
// headers === { foo: 'bar', 'cookie': ['foo=bar', 'bar=baz'] } copy

request.getRawHeaderNames()

Добавлено в: v15.13.0, v14.17.0
  • Возвращает: <string[]>

Возвращает массив с уникальными именами текущих исходящих необработанных заголовков. Имена заголовков возвращаются в точном заданном регистре.

request.setHeader('Foo', 'bar');
request.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);

const headerNames = request.getRawHeaderNames();
// headerNames === ['Foo', 'Set-Cookie'] copy

request.hasHeader(name)

Добавлено в: v7.7.0
  • name <string>
  • Возвращает: <boolean>

Возвращает true, если заголовок с именем name задан в исходящих заголовках. При сопоставлении имен заголовков регистр не учитывается.

const hasContentType = request.hasHeader('content-type'); copy

request.maxHeadersCount

  • Тип: <number> По умолчанию: 2000

Ограничивает максимальное количество заголовков ответа. Если задать значение 0, ограничение не применяется.

request.path

Добавлено в: v0.4.0
  • Тип: <string> Путь запроса.

request.method

Добавлено в: v0.1.97
  • Тип: <string> Метод запроса.

request.host

Добавлено в: v14.5.0, v12.19.0
  • Тип: <string> Хост запроса.

request.protocol

Добавлено в: v14.5.0, v12.19.0
  • Тип: <string> Протокол запроса.

request.removeHeader(name)

Добавлено в: v1.6.0
  • name <string>

Удаляет заголовок, уже заданный в объекте заголовков.

request.removeHeader('Content-Type'); copy

request.reusedSocket

Добавлено в: v13.0.0, v12.16.0
  • Тип: <boolean> Указывает, отправляется ли запрос через повторно используемый сокет.

При отправке запроса через агент с включенным keep-alive базовый сокет может быть использован повторно. Но если сервер закроет соединение в неподходящий момент, клиент может получить ошибку «ECONNRESET».

Модули JavaScript
import http from 'node:http';

// Server has a 5 seconds keep-alive timeout by default
http
  .createServer((req, res) => {
    res.write('hello\n');
    res.end();
  })
  .listen(3000);

setInterval(() => {
  // Adapting a keep-alive agent
  http.get('http://localhost:3000', { agent }, (res) => {
    res.on('data', (data) => {
      // Do nothing
    });
  });
}, 5000); // Sending request on 5s interval so it's easy to hit idle timeout
CommonJS
const http = require('node:http');

// Server has a 5 seconds keep-alive timeout by default
http
  .createServer((req, res) => {
    res.write('hello\n');
    res.end();
  })
  .listen(3000);

setInterval(() => {
  // Adapting a keep-alive agent
  http.get('http://localhost:3000', { agent }, (res) => {
    res.on('data', (data) => {
      // Do nothing
    });
  });
}, 5000); // Sending request on 5s interval so it's easy to hit idle timeout

Отмечая, использовал ли запрос повторно сокет, можно автоматически повторять запрос при возникновении ошибки.

Модули JavaScript
import http from 'node:http';
const agent = new http.Agent({ keepAlive: true });

function retriableRequest() {
  const req = http
    .get('http://localhost:3000', { agent }, (res) => {
      // ...
    })
    .on('error', (err) => {
      // Check if retry is needed
      if (req.reusedSocket && err.code === 'ECONNRESET') {
        retriableRequest();
      }
    });
}

retriableRequest();
CommonJS
const http = require('node:http');
const agent = new http.Agent({ keepAlive: true });

function retriableRequest() {
  const req = http
    .get('http://localhost:3000', { agent }, (res) => {
      // ...
    })
    .on('error', (err) => {
      // Check if retry is needed
      if (req.reusedSocket && err.code === 'ECONNRESET') {
        retriableRequest();
      }
    });
}

retriableRequest();

request.setHeader(name, value)

Добавлено в: v1.6.0
  • name <string>
  • value <any>

Задает одно значение заголовка в объекте заголовков. Если такой заголовок уже присутствует среди заголовков, предназначенных для отправки, его значение будет заменено. Чтобы отправить несколько заголовков с одинаковым именем, используйте массив строк. Значения нестрокового типа сохраняются без изменений. Поэтому request.getHeader() может возвращать значения нестрокового типа. Однако при передаче по сети они будут преобразованы в строки.

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

или

request.setHeader('Cookie', ['type=ninja', 'language=javascript']); copy

Если значение является строкой, будет выброшено исключение, если она содержит символы за пределами кодировки latin1.

Если необходимо передать в значении символы UTF-8, закодируйте значение в соответствии со стандартом RFC 8187.

const filename = 'Rock 🎵.txt';
request.setHeader('Content-Disposition', `attachment; filename*=utf-8''${encodeURIComponent(filename)}`); copy

request.setNoDelay([noDelay])

Добавлено в: v0.5.9
  • noDelay <boolean>

После назначения сокета этому запросу и установления соединения будет вызван socket.setNoDelay().

request.setSocketKeepAlive([enable][, initialDelay])

Добавлено в: v0.5.9
  • enable <boolean>
  • initialDelay <number>

После назначения сокета этому запросу и установления соединения будет вызван socket.setKeepAlive().

request.setTimeout(timeout[, callback])

История
Версия Изменения
v9.0.0

Тайм-аут сокета теперь всегда задается только после установления соединения.

v0.5.9

Добавлено в: v0.5.9

  • timeout <number> Количество миллисекунд до истечения времени ожидания запроса.
  • callback <Function> Необязательная функция, вызываемая при истечении времени ожидания. То же, что и привязка к событию 'timeout'.
  • Возвращает: <http.ClientRequest>

После назначения сокета этому запросу и установления соединения будет вызван socket.setTimeout().

request.socket

Добавлено в: v0.3.0
  • Тип: <stream.Duplex>

Ссылка на базовый сокет. Обычно пользователям не требуется обращаться к этому свойству. В частности, сокет не будет генерировать события 'readable' из-за того, как анализатор протокола подключается к сокету.

Модули JavaScript
import http from 'node:http';
const options = {
  host: 'www.google.com',
};
const req = http.get(options);
req.end();
req.once('response', (res) => {
  const ip = req.socket.localAddress;
  const port = req.socket.localPort;
  console.log(`Your IP address is ${ip} and your source port is ${port}.`);
  // Consume response object
});
CommonJS
const http = require('node:http');
const options = {
  host: 'www.google.com',
};
const req = http.get(options);
req.end();
req.once('response', (res) => {
  const ip = req.socket.localAddress;
  const port = req.socket.localPort;
  console.log(`Your IP address is ${ip} and your source port is ${port}.`);
  // Consume response object
});

Это свойство гарантированно содержит экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

request.uncork()

Добавлено в: v13.2.0, v12.16.0

См. writable.uncork().

request.writableEnded

Добавлено в: v12.9.0
  • Тип: <boolean>

Равно true после вызова request.end(). Это свойство не указывает, были ли данные сброшены; для этого используйте request.writableFinished.

request.writableFinished

Добавлено в: v12.7.0
  • Тип: <boolean>

Равно true, если все данные сброшены в базовую систему; это происходит непосредственно перед генерацией события 'finish'.

request.write(chunk[, encoding][, callback])

История
Версия Изменения
v15.0.0

Параметр chunk теперь может быть Uint8Array.

v0.1.29

Добавлено в: v0.1.29

  • chunk <string> | <Buffer> | <Uint8Array>
  • encoding <string>
  • callback <Function>
  • Возвращает: <boolean>

Отправляет фрагмент тела запроса. Этот метод можно вызывать несколько раз. Если Content-Length не задан, данные будут автоматически кодироваться с помощью HTTP Chunked transfer encoding, чтобы сервер знал, когда передача данных завершена. Добавляется заголовок Transfer-Encoding: chunked. Для завершения отправки запроса необходимо вызвать request.end().

Аргумент encoding является необязательным и применяется только в том случае, если chunk — строка. По умолчанию используется 'utf8'.

Аргумент callback является необязательным и будет вызван после отправки этого фрагмента данных, но только если фрагмент не пуст.

Возвращает true, если все данные успешно переданы в буфер ядра. Возвращает false, если все данные или их часть помещены в очередь в пользовательской памяти. Событие 'drain' будет создано, когда буфер снова освободится.

Если функция write вызывается с пустой строкой или буфером, она ничего не делает и ожидает дальнейший ввод.

Класс: http.Server

Добавлено в: v0.1.17
  • Наследует: <net.Server>

Событие: 'checkContinue'

Добавлено в: v0.3.0
  • request <http.IncomingMessage>
  • response <http.ServerResponse>

Создается при получении каждого запроса с HTTP Expect: 100-continue. Если обработчик этого события не задан, сервер автоматически отправит соответствующий 100 Continue.

Для обработки этого события необходимо вызвать response.writeContinue(), если клиенту следует продолжить отправку тела запроса, либо сформировать соответствующий HTTP-ответ (например, 400 Bad Request), если клиенту не следует продолжать отправку тела запроса.

Когда это событие создано и обработано, событие 'request' создано не будет.

Событие: 'checkExpectation'

Добавлено в: v5.5.0
  • request <http.IncomingMessage>
  • response <http.ServerResponse>

Создается при получении каждого запроса с HTTP-заголовком Expect, значение которого не равно 100-continue. Если обработчик этого события не задан, сервер автоматически отправит соответствующий 417 Expectation Failed.

Когда это событие создано и обработано, событие 'request' создано не будет.

Событие: 'clientError'

История
Версия Изменения
v12.0.0

При возникновении ошибки HPE_HEADER_OVERFLOW поведение по умолчанию изменено: теперь возвращается ответ 431 Request Header Fields Too Large.

v9.4.0

rawPacket — это текущий буфер, который только что был обработан. Добавление этого буфера в объект ошибки события 'clientError' позволяет разработчикам записывать в журнал поврежденный пакет.

v6.0.0

Действие по умолчанию, вызов .destroy() для socket, больше не выполняется, если для 'clientError' добавлены обработчики.

v0.1.94

Добавлено в: v0.1.94

  • exception <Error>
  • socket <stream.Duplex>

Если для подключения клиента возникает событие 'error', оно будет передано сюда. Обработчик этого события отвечает за закрытие или уничтожение базового сокета. Например, можно закрыть сокет более корректно, отправив пользовательский HTTP-ответ, а не разрывая соединение внезапно. До завершения работы обработчика сокет должен быть закрыт или уничтожен.

Гарантируется, что в обработчик будет передан экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

По умолчанию предпринимается попытка закрыть сокет, отправив HTTP-ответ «400 Bad Request» или, в случае ошибки HPE_HEADER_OVERFLOW, HTTP-ответ «431 Request Header Fields Too Large». Если сокет недоступен для записи или заголовки текущего присоединенного http.ServerResponse уже отправлены, сокет немедленно уничтожается.

socket — это объект net.Socket, в котором возникла ошибка.

Модули JavaScript
import http from 'node:http';

const server = http.createServer((req, res) => {
  res.end();
});
server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);
CommonJS
const http = require('node:http');

const server = http.createServer((req, res) => {
  res.end();
});
server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);

При возникновении события 'clientError' объекта request или response не существует, поэтому любой HTTP-ответ, включая заголовки и содержимое ответа, необходимо записывать непосредственно в объект socket. Следует убедиться, что ответ является правильно сформированным сообщением HTTP.

err — это экземпляр Error с двумя дополнительными свойствами:

  • bytesParsed: количество байтов пакета запроса, которые Node.js, возможно, успешно обработал;
  • rawPacket: необработанный пакет текущего запроса.

В некоторых случаях клиент уже получил ответ и/или сокет уже уничтожен, например при ошибках ECONNRESET. Прежде чем отправлять данные в сокет, лучше проверить, доступен ли он для записи.

server.on('clientError', (err, socket) => {
  if (err.code === 'ECONNRESET' || !socket.writable) {
    return;
  }

  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
}); copy

Событие: 'close'

Добавлено в: v0.1.4

Создается при закрытии сервера.

Событие: 'connect'

Добавлено в: v0.7.0
  • request <http.IncomingMessage> Аргументы HTTP-запроса, как и в событии 'request'
  • socket <stream.Duplex> Сетевой сокет между сервером и клиентом
  • head <Buffer> Первый пакет туннельного потока (может быть пустым)

Создается при каждом запросе клиента с HTTP-методом CONNECT. Если обработчик этого события не задан, соединения клиентов, запрашивающих метод CONNECT, будут закрыты.

Гарантируется, что в обработчик будет передан экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

После создания этого события у сокета запроса не будет обработчика события 'data', поэтому его необходимо добавить, чтобы обрабатывать данные, отправленные серверу через этот сокет.

Событие: 'connection'

Добавлено в: v0.1.0
  • socket <stream.Duplex>

Это событие создается при установлении нового TCP-потока. Обычно socket — это объект типа net.Socket. Как правило, пользователям не требуется обращаться к этому событию. В частности, сокет не будет создавать события 'readable' из-за того, как анализатор протокола подключается к сокету. Доступ к socket также можно получить по адресу request.socket.

Пользователи также могут явно создавать это событие, чтобы передавать подключения HTTP-серверу. В этом случае можно передать любой поток Duplex.

Если здесь вызывается socket.setTimeout(), время ожидания будет заменено на server.keepAliveTimeout после обработки сокетом запроса (если server.keepAliveTimeout не равен нулю).

Гарантируется, что в обработчик будет передан экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

Событие: 'dropRequest'

Добавлено в: v18.7.0, v16.17.0
  • request <http.IncomingMessage> Аргументы HTTP-запроса, как и в событии 'request'
  • socket <stream.Duplex> Сетевой сокет между сервером и клиентом

Когда количество запросов через сокет достигает порогового значения server.maxRequestsPerSocket, сервер отбрасывает новые запросы, создавая вместо этого событие 'dropRequest', а затем отправляет клиенту 503.

Событие: 'request'

Добавлено в: v0.1.0
  • request <http.IncomingMessage>
  • response <http.ServerResponse>

Создается при каждом получении запроса. Через одно соединение может поступить несколько запросов (в случае HTTP-соединений с Keep-Alive).

Событие: 'upgrade'

История
Версия Изменения
v10.0.0

Отсутствие обработчика этого события больше не приводит к уничтожению сокета, если клиент отправляет заголовок Upgrade.

v0.1.94

Добавлено в: v0.1.94

  • request <http.IncomingMessage> Аргументы HTTP-запроса, как и в событии 'request'
  • socket <stream.Duplex> Сетевой сокет между сервером и клиентом
  • head <Buffer> Первый пакет обновленного потока (может быть пустым)

Создается при каждом запросе клиента на обновление HTTP-соединения. Обработчик этого события необязателен, и клиенты не могут требовать смены протокола.

После создания этого события у сокета запроса не будет обработчика события 'data', поэтому его необходимо добавить, чтобы обрабатывать данные, отправленные серверу через этот сокет.

Гарантируется, что в обработчик будет передан экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

server.close([callback])

История
Версия Изменения
v19.0.0

Перед возвратом метод закрывает неактивные соединения.

v0.1.90

Добавлено в: v0.1.90

  • callback <Function>

Прекращает прием новых подключений сервером и закрывает все подключения к этому серверу, по которым не отправляется запрос и не ожидается ответ. См. net.Server.close().

const http = require('node:http');

const server = http.createServer({ keepAliveTimeout: 60000 }, (req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000);
// Close the server after 10 seconds
setTimeout(() => {
  server.close(() => {
    console.log('server on port 8000 closed successfully');
  });
}, 10000); copy

server.closeAllConnections()

Добавлено в: v18.2.0

Закрывает все установленные HTTP(S)-подключения к этому серверу, включая активные подключения, по которым отправляется запрос или ожидается ответ. При этом не уничтожаются сокеты, переключенные на другой протокол, например WebSocket или HTTP/2.

Это принудительный способ закрыть все подключения, и использовать его следует с осторожностью. При использовании этого метода вместе с server.close рекомендуется вызывать его после server.close, чтобы избежать состояния гонки, при котором между вызовами этого метода и server.close создаются новые подключения.

const http = require('node:http');

const server = http.createServer({ keepAliveTimeout: 60000 }, (req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000);
// Close the server after 10 seconds
setTimeout(() => {
  server.close(() => {
    console.log('server on port 8000 closed successfully');
  });
  // Closes all connections, ensuring the server closes successfully
  server.closeAllConnections();
}, 10000); copy

server.closeIdleConnections()

Добавлено в: v18.2.0

Закрывает все подключения к этому серверу, по которым не отправляется запрос и не ожидается ответ.

Начиная с Node.js 19.0.0, для закрытия неактивных подключений keep-alive больше не нужно вызывать этот метод вместе с server.close. Однако его вызов не причинит вреда и может быть полезен для обеспечения обратной совместимости библиотек и приложений, которым необходимо поддерживать версии старше 19.0.0. При использовании этого метода вместе с server.close рекомендуется вызывать его после server.close, чтобы избежать состояния гонки, при котором между вызовами этого метода и server.close создаются новые подключения.

const http = require('node:http');

const server = http.createServer({ keepAliveTimeout: 60000 }, (req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000);
// Close the server after 10 seconds
setTimeout(() => {
  server.close(() => {
    console.log('server on port 8000 closed successfully');
  });
  // Closes idle connections, such as keep-alive connections. Server will close
  // once remaining active connections are terminated
  server.closeIdleConnections();
}, 10000); copy

server.headersTimeout

История
Версия Изменения
v19.4.0, v18.14.0

Теперь значение по умолчанию равно меньшему из значений: 60000 (60 секунд) или requestTimeout.

v11.3.0, v10.14.0

Добавлено в: v11.3.0, v10.14.0

  • Тип: <number> По умолчанию: меньшее из значений server.requestTimeout и 60000.

Ограничивает время ожидания парсера при получении полных HTTP-заголовков.

По истечении времени ожидания сервер отвечает кодом состояния 408, не передавая запрос обработчику запросов, а затем закрывает соединение.

Для защиты от потенциальных атак типа «отказ в обслуживании» это значение должно быть ненулевым (например, 120 секунд), если сервер развернут без обратного прокси.

server.listen()

Запускает HTTP-сервер и начинает прослушивать подключения. Этот метод идентичен методу server.listen() класса net.Server.

server.listening

Добавлено в: v5.7.0
  • Тип: <boolean> Указывает, прослушивает ли сервер подключения.

server.maxHeadersCount

Добавлено в: v0.7.0
  • Тип: <number> По умолчанию: 2000

Ограничивает максимальное количество входящих заголовков. Если установить значение 0, ограничение не применяется.

server.requestTimeout

История
Версия Изменения
v18.0.0

Значение времени ожидания запроса по умолчанию изменено с отсутствия ограничения на 300 с (5 минут).

v14.11.0

Добавлено в: v14.11.0

  • Тип: <number> По умолчанию: 300000

Задает время ожидания в миллисекундах для получения полного запроса от клиента.

По истечении времени ожидания сервер отвечает кодом состояния 408, не передавая запрос обработчику запросов, а затем закрывает соединение.

Для защиты от потенциальных атак типа «отказ в обслуживании» это значение должно быть ненулевым (например, 120 секунд), если сервер развернут без обратного прокси.

server.setTimeout([msecs][, callback])

История
Версия Изменения
v13.0.0

Значение времени ожидания по умолчанию изменено со 120 с на 0 (без ограничения времени ожидания).

v0.9.12

Добавлено в: v0.9.12

  • msecs <number> По умолчанию: 0 (без ограничения времени ожидания)
  • callback <Function>
  • Возвращает: <http.Server>

Задает время ожидания для сокетов и создает событие 'timeout' для объекта Server, передавая сокет в качестве аргумента, если время ожидания истекло.

Если у объекта Server есть обработчик события 'timeout', он будет вызван с сокетом, для которого истекло время ожидания, в качестве аргумента.

По умолчанию для сокетов сервера время ожидания не ограничено. Однако если объекту Server назначен обработчик события 'timeout', необходимо явно обрабатывать истечение времени ожидания.

server.maxRequestsPerSocket

Добавлено в: v16.10.0
  • Тип: <number> Количество запросов на сокет. По умолчанию: 0 (без ограничений)

Максимальное количество запросов, которое может обработать сокет до закрытия keep-alive-соединения.

Значение 0 отключает ограничение.

При достижении ограничения значение заголовка Connection будет установлено в close, но само соединение не будет закрыто. На последующие запросы, отправленные после достижения ограничения, будет дан ответ 503 Service Unavailable.

server.timeout

История
Версия Изменения
v13.0.0

Значение времени ожидания по умолчанию изменено со 120 с на 0 (без ограничения времени ожидания).

v0.9.12

Добавлено в: v0.9.12

  • Тип: <number> Время ожидания в миллисекундах. По умолчанию: 0 (без ограничения времени ожидания)

Количество миллисекунд бездействия, после которого считается, что время ожидания сокета истекло.

Значение 0 отключает обработку времени ожидания для входящих подключений.

Логика отслеживания времени ожидания сокета настраивается при подключении, поэтому изменение этого значения влияет только на новые подключения к серверу, но не на уже существующие.

server.keepAliveTimeout

Добавлено в: v8.0.0
  • Тип: <number> Время ожидания в миллисекундах. По умолчанию: 5000 (5 секунд).

Количество миллисекунд бездействия, в течение которого сервер ожидает дополнительные входящие данные после отправки последнего ответа, прежде чем сокет будет уничтожен.

Это значение времени ожидания используется вместе с параметром server.keepAliveTimeoutBuffer для определения фактического времени ожидания сокета, вычисляемого по формуле: socketTimeout = keepAliveTimeout + keepAliveTimeoutBuffer. Если сервер получает новые данные до истечения времени ожидания keep-alive, обычный таймер бездействия сбрасывается, то есть server.timeout.

Значение 0 отключает обработку времени ожидания keep-alive для входящих подключений. Значение 0 обеспечивает поведение HTTP-сервера, аналогичное версиям Node.js до 8.0.0, в которых время ожидания keep-alive не предусматривалось.

Логика отслеживания времени ожидания сокета настраивается при подключении, поэтому изменение этого значения влияет только на новые подключения к серверу, но не на уже существующие.

server.keepAliveTimeoutBuffer

Добавлено в: v22.19.0
  • Тип: <number> Время ожидания в миллисекундах. По умолчанию: 1000 (1 секунда).

Дополнительный интервал, добавляемый к параметру server.keepAliveTimeout для увеличения внутреннего времени ожидания сокета.

Этот интервал помогает уменьшить количество ошибок сброса соединения (ECONNRESET), немного увеличивая время ожидания сокета относительно объявленного времени ожидания keep-alive.

Этот параметр применяется только к новым входящим подключениям.

server[Symbol.asyncDispose]()

Добавлено в: v20.4.0
Стабильность: 1 — Экспериментальный

Вызывает server.close() и возвращает промис, который выполняется после закрытия сервера.

Класс: http.ServerResponse

Добавлено в: v0.1.17
  • Расширяет: <http.OutgoingMessage>

Этот объект создаётся внутренними средствами HTTP-сервера, а не пользователем. Он передаётся в качестве второго параметра события 'request'.

Событие: 'close'

Добавлено в: v0.6.7

Указывает, что ответ завершён или лежащее в его основе соединение было преждевременно разорвано (до завершения ответа).

Событие: 'finish'

Добавлено в: v0.3.6

Вызывается, когда ответ отправлен. Точнее, это событие вызывается, когда последний фрагмент заголовков и тела ответа передан операционной системе для отправки по сети. Это не означает, что клиент уже что-либо получил.

response.addTrailers(headers)

Добавлено в: v0.3.0
  • headers <Object>

Этот метод добавляет к ответу завершающие HTTP-заголовки (заголовок в конце сообщения).

Завершающие заголовки будут отправлены, только если для ответа используется кодирование с разбиением на блоки; в противном случае (например, если запрос был HTTP/1.0) они будут молча отброшены.

Для отправки завершающих заголовков HTTP требует передать заголовок Trailer со списком имён полей заголовков в его значении. Например:

response.writeHead(200, { 'Content-Type': 'text/plain',
                          'Trailer': 'Content-MD5' });
response.write(fileData);
response.addTrailers({ 'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667' });
response.end(); copy

Попытка задать имя поля заголовка или его значение, содержащее недопустимые символы, приведёт к выбросу TypeError.

response.connection

Добавлено в: v0.3.0Устарело с: v13.0.0
Стабильность: 0 — Устарело. Используйте response.socket.
  • Тип: <stream.Duplex>

См. response.socket.

response.cork()

Добавлено в: v13.2.0, v12.16.0

См. writable.cork().

response.end([data[, encoding]][, callback])

История
Версия Изменения
v15.0.0

Теперь параметром data может быть Uint8Array.

v10.0.0

Теперь этот метод возвращает ссылку на ServerResponse.

v0.1.90

Добавлено в: v0.1.90

  • data <string> | <Buffer> | <Uint8Array>
  • encoding <string>
  • callback <Function>
  • Возвращает: <this>

Этот метод сообщает серверу, что все заголовки и тело ответа отправлены; серверу следует считать это сообщение завершённым. Метод response.end() ДОЛЖЕН вызываться для каждого ответа.

Если указан data, эффект аналогичен вызову response.write(data, encoding), за которым следует response.end(callback).

Если указан callback, он будет вызван после завершения потока ответа.

response.finished

Добавлено в: v0.0.2Устарело с: v13.4.0, v12.16.0
Стабильность: 0 — Устарело. Используйте response.writableEnded.
  • Тип: <boolean>

Свойство response.finished принимает значение true, если был вызван response.end().

response.flushHeaders()

Добавлено в: v1.6.0

Отправляет заголовки ответа. См. также: request.flushHeaders().

response.getHeader(name)

Добавлено в: v0.4.0
  • name <string>
  • Возвращает: <any>

Возвращает заголовок, уже добавленный в очередь, но ещё не отправленный клиенту. Регистр букв в имени не учитывается. Тип возвращаемого значения зависит от аргументов, переданных в response.setHeader().

response.setHeader('Content-Type', 'text/html');
response.setHeader('Content-Length', Buffer.byteLength(body));
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
const contentType = response.getHeader('content-type');
// contentType is 'text/html'
const contentLength = response.getHeader('Content-Length');
// contentLength is of type number
const setCookie = response.getHeader('set-cookie');
// setCookie is of type string[] copy

response.getHeaderNames()

Добавлено в: v7.7.0
  • Возвращает: <string[]>

Возвращает массив с уникальными именами текущих исходящих заголовков. Все имена заголовков записаны строчными буквами.

response.setHeader('Foo', 'bar');
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);

const headerNames = response.getHeaderNames();
// headerNames === ['foo', 'set-cookie'] copy

response.getHeaders()

Добавлено в: v7.7.0
  • Возвращает: <Object>

Возвращает поверхностную копию текущих исходящих заголовков. Поскольку используется поверхностная копия, значения-массивы можно изменять без дополнительных вызовов различных методов модуля http, связанных с заголовками. Ключи возвращаемого объекта — это имена заголовков, а значения — соответствующие значения заголовков. Все имена заголовков записаны строчными буквами.

Объект, возвращаемый методом response.getHeaders(), не наследует прототип от JavaScript-объекта Object. Это означает, что стандартные методы Object, например obj.toString(), obj.hasOwnProperty() и другие, не определены и не будут работать.

response.setHeader('Foo', 'bar');
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);

const headers = response.getHeaders();
// headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } copy

response.hasHeader(name)

Добавлено в: v7.7.0
  • name <string>
  • Возвращает: <boolean>

Возвращает true, если заголовок с именем name в данный момент задан среди исходящих заголовков. При сравнении имён заголовков регистр букв не учитывается.

const hasContentType = response.hasHeader('content-type'); copy

response.headersSent

Добавлено в: v0.9.3
  • Тип: <boolean>

Логическое значение (только для чтения). True, если заголовки отправлены, и false в противном случае.

response.removeHeader(name)

Добавлено в: v0.4.0
  • name <string>

Удаляет заголовок, добавленный в очередь для неявной отправки.

response.removeHeader('Content-Encoding'); copy

response.req

Добавлено в: v15.7.0
  • Тип: <http.IncomingMessage>

Ссылка на исходный объект HTTP request.

response.sendDate

Добавлено в: v0.7.5
  • Тип: <boolean>

Если значение равно true, заголовок Date будет автоматически сформирован и отправлен в ответе, если он ещё не присутствует среди заголовков. По умолчанию — true.

Отключать эту настройку следует только для тестирования; HTTP требует наличия заголовка Date в ответах.

response.setHeader(name, value)

Добавлено в: v0.4.0
  • name <string>
  • value <any>
  • Возвращает: <http.ServerResponse>

Возвращает объект ответа.

Задаёт одно значение заголовка для неявных заголовков. Если этот заголовок уже присутствует среди заголовков, которые будут отправлены, его значение будет заменено. Чтобы отправить несколько заголовков с одинаковым именем, используйте здесь массив строк. Значения нестрокового типа сохраняются без изменений. Поэтому response.getHeader() может возвращать значения нестрокового типа. Однако при передаче по сети они будут преобразованы в строки. Вызывающей стороне возвращается тот же объект ответа, что позволяет объединять вызовы в цепочку.

response.setHeader('Content-Type', 'text/html'); copy

или

response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']); copy

Попытка задать имя поля заголовка или его значение, содержащее недопустимые символы, приведёт к выбросу TypeError.

Заголовки, заданные с помощью response.setHeader(), будут объединены с заголовками, переданными в response.writeHead(); при этом приоритет будет отдан заголовкам, переданным в response.writeHead().

// Returns content-type = text/plain
const server = http.createServer((req, res) => {
  res.setHeader('Content-Type', 'text/html');
  res.setHeader('X-Foo', 'bar');
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('ok');
}); copy

Если вызван метод response.writeHead(), а этот метод не вызывался, переданные значения заголовков будут напрямую записаны в сетевой канал без внутреннего кэширования, и response.getHeader() для заголовка не вернёт ожидаемый результат. Если требуется поэтапно заполнять заголовки с возможностью последующего получения и изменения, используйте response.setHeader() вместо response.writeHead().

response.setTimeout(msecs[, callback])

Добавлено в: v0.9.12
  • msecs <number>
  • callback <Function>
  • Возвращает: <http.ServerResponse>

Задаёт для сокета значение тайм-аута msecs. Если передан callback, он добавляется в качестве обработчика события 'timeout' объекта ответа.

Если для запроса, ответа или сервера не добавлен обработчик события 'timeout', сокеты уничтожаются по истечении тайм-аута. Если обработчик назначен для события 'timeout' запроса, ответа или сервера, обработку сокетов с истёкшим тайм-аутом необходимо реализовать явно.

response.socket

Добавлено в: v0.3.0
  • Тип: <stream.Duplex>

Ссылка на лежащий в основе сокет. Обычно пользователям не требуется обращаться к этому свойству. В частности, сокет не будет генерировать события 'readable' из-за особенностей подключения анализатора протокола к сокету. После response.end() свойство принимает значение null.

Модули JavaScript
import http from 'node:http';
const server = http.createServer((req, res) => {
  const ip = res.socket.remoteAddress;
  const port = res.socket.remotePort;
  res.end(`Your IP address is ${ip} and your source port is ${port}.`);
}).listen(3000);
CommonJS
const http = require('node:http');
const server = http.createServer((req, res) => {
  const ip = res.socket.remoteAddress;
  const port = res.socket.remotePort;
  res.end(`Your IP address is ${ip} and your source port is ${port}.`);
}).listen(3000);

Гарантируется, что это свойство содержит экземпляр класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>.

response.statusCode

Добавлено в: v0.4.0
  • Тип: <number> По умолчанию: 200

При использовании неявных заголовков (если response.writeHead() не вызывается явно) это свойство задаёт код состояния, который будет отправлен клиенту при отправке заголовков.

response.statusCode = 404; copy

После отправки заголовков ответа клиенту это свойство содержит отправленный код состояния.

response.statusMessage

Добавлено в: v0.11.8
  • Тип: <string>

При использовании неявных заголовков (если response.writeHead() не вызывается явно) это свойство задаёт сообщение о состоянии, которое будет отправлено клиенту при отправке заголовков. Если оставить значение равным undefined, будет использовано стандартное сообщение для данного кода состояния.

response.statusMessage = 'Not found'; copy

После отправки заголовков ответа клиенту это свойство содержит отправленное сообщение о состоянии.

response.strictContentLength

Добавлено в: v18.10.0, v16.18.0
  • Тип: <boolean> По умолчанию: false

Если задано значение true, Node.js проверит, совпадает ли значение заголовка Content-Length с размером тела в байтах. Несоответствие значения заголовка Content-Length приведёт к выбросу Error с кодом code: 'ERR_HTTP_CONTENT_LENGTH_MISMATCH'.

response.uncork()

Добавлено в: v13.2.0, v12.16.0

См. writable.uncork().

response.writableEnded

Добавлено в: v12.9.0
  • Тип: <boolean>

Равно true после вызова response.end(). Это свойство не указывает, были ли данные отправлены; для этого используйте response.writableFinished.

response.writableFinished

Добавлено в: v12.7.0
  • Тип: <boolean>

Равно true, если все данные отправлены в базовую систему, непосредственно перед вызовом события 'finish'.

response.write(chunk[, encoding][, callback])

История
Версия Изменения
v15.0.0

Теперь параметром chunk может быть Uint8Array.

v0.1.29

Добавлено в: v0.1.29

  • chunk <string> | <Buffer> | <Uint8Array>
  • encoding <string> По умолчанию: 'utf8'
  • callback <Function>
  • Возвращает: <boolean>

Если этот метод вызван до вызова response.writeHead(), будет выполнен переход в режим неявных заголовков и отправлены неявные заголовки.

Отправляет фрагмент тела ответа. Этот метод можно вызывать несколько раз, передавая последовательные части тела.

Если в createServer для rejectNonStandardBodyWrites задано значение true, запись в тело запрещена, когда метод запроса или статус ответа не допускают наличие содержимого. При попытке записать данные в тело HEAD-запроса либо ответа типа 204 или 304 будет синхронно выброшена ошибка Error с кодом ERR_HTTP_BODY_NOT_ALLOWED.

chunk может быть строкой или буфером. Если chunk — строка, второй параметр определяет способ её кодирования в поток байтов. callback будет вызван, когда этот фрагмент данных будет отправлен.

Это необработанное тело HTTP, не связанное с кодированием тела в составном формате более высокого уровня, которое может использоваться.

При первом вызове response.write() клиенту будут отправлены буферизованные заголовки и первый фрагмент тела. При втором вызове response.write() Node.js предполагает, что данные будут передаваться потоком, и отправляет новые данные отдельно. Таким образом, ответ буферизуется до первого фрагмента тела.

Возвращает true, если все данные успешно отправлены в буфер ядра. Возвращает false, если все данные или их часть поставлены в очередь в памяти пользователя. Событие 'drain' будет вызвано, когда буфер снова освободится.

response.writeContinue()

Добавлено в: v0.3.0

Отправляет клиенту сообщение HTTP/1.1 100 Continue, указывающее, что следует отправить тело запроса. См. событие 'checkContinue' объекта Server.

response.writeEarlyHints(hints[, callback])

История
Версия Изменения
v18.11.0

Теперь подсказки можно передавать в виде объекта.

v18.11.0

Добавлено в: v18.11.0

  • hints <Object>
  • callback <Function>

Отправляет клиенту сообщение HTTP/1.1 103 Early Hints с заголовком Link, указывающим, что пользовательский агент может предварительно загрузить связанные ресурсы или установить с ними предварительное соединение. hints — объект со значениями заголовков, которые будут отправлены в сообщении ранних подсказок. Необязательный аргумент callback будет вызван после записи сообщения ответа.

Пример

const earlyHintsLink = '</styles.css>; rel=preload; as=style';
response.writeEarlyHints({
  'link': earlyHintsLink,
});

const earlyHintsLinks = [
  '</styles.css>; rel=preload; as=style',
  '</scripts.js>; rel=preload; as=script',
];
response.writeEarlyHints({
  'link': earlyHintsLinks,
  'x-trace-id': 'id for diagnostics',
});

const earlyHintsCallback = () => console.log('early hints message sent');
response.writeEarlyHints({
  'link': earlyHintsLinks,
}, earlyHintsCallback); copy

response.writeHead(statusCode[, statusMessage][, headers])

История
Версия Изменения
v14.14.0

Добавлена возможность передавать заголовки в виде массива.

v11.10.0, v10.17.0

Возвращает this из writeHead(), чтобы разрешить объединение вызовов в цепочку с end().

v5.11.0, v4.4.5

Выбрасывается RangeError, если statusCode не является числом в диапазоне [100, 999].

v0.1.30

Добавлено в: v0.1.30

  • statusCode <number>
  • statusMessage <string>
  • headers <Object> | <Array>
  • Возвращает: <http.ServerResponse>

Отправляет заголовок ответа на запрос. Код состояния — это трёхзначный код состояния HTTP, например 404. Последний аргумент, headers, содержит заголовки ответа. Вторым аргументом можно дополнительно передать понятное человеку statusMessage.

headers может быть Array, в котором ключи и значения расположены в одном списке. Это не список кортежей. Таким образом, элементы с чётными индексами содержат ключи, а с нечётными — соответствующие значения. Массив имеет тот же формат, что и request.rawHeaders.

Возвращает ссылку на ServerResponse, что позволяет объединять вызовы в цепочку.

const body = 'hello world';
response
  .writeHead(200, {
    'Content-Length': Buffer.byteLength(body),
    'Content-Type': 'text/plain',
  })
  .end(body); copy

Этот метод можно вызывать только один раз для сообщения и до вызова response.end().

Если до этого вызвать response.write() или response.end(), будут вычислены неявные/изменяемые заголовки и вызвана эта функция.

Заголовки, заданные с помощью response.setHeader(), будут объединены с заголовками, переданными в response.writeHead(); при этом приоритет будет отдан заголовкам, переданным в response.writeHead().

Если этот метод вызван, а response.setHeader() не вызывался, переданные значения заголовков будут напрямую записаны в сетевой канал без внутреннего кэширования, и response.getHeader() для заголовка не вернёт ожидаемый результат. Если требуется поэтапно заполнять заголовки с возможностью последующего получения и изменения, используйте вместо этого response.setHeader().

// Returns content-type = text/plain
const server = http.createServer((req, res) => {
  res.setHeader('Content-Type', 'text/html');
  res.setHeader('X-Foo', 'bar');
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('ok');
}); copy

Content-Length измеряется в байтах, а не в символах. Используйте Buffer.byteLength(), чтобы определить размер тела в байтах. Node.js проверит, совпадает ли Content-Length с размером переданного тела.

Попытка задать имя поля заголовка или его значение, содержащее недопустимые символы, приведёт к выбросу TypeError.

response.writeProcessing()

Добавлено в: v10.0.0

Отправляет клиенту сообщение HTTP/1.1 102 Processing, указывающее, что следует отправить тело запроса.

Class: http.IncomingMessage

История
Версия Изменения
v15.5.0

Значение destroyed возвращает true после получения входящих данных.

v13.1.0, v12.16.0

Значение readableHighWaterMark соответствует значению сокета.

v0.1.17

Добавлено в: v0.1.17

  • Наследует: <stream.Readable>

Объект IncomingMessage создается объектом http.Server или http.ClientRequest и передается в качестве первого аргумента событиям 'request' и 'response' соответственно. Его можно использовать для доступа к статусу ответа, заголовкам и данным.

В отличие от значения socket, являющегося подклассом <stream.Duplex>, сам IncomingMessage наследует <stream.Readable> и создается отдельно для разбора и выдачи входящих HTTP-заголовков и полезной нагрузки, поскольку базовый сокет может использоваться повторно несколько раз в случае постоянного соединения.

Событие: 'aborted'

Добавлено в: v0.3.8Устарело с: v17.0.0, v16.12.0
Стабильность: 0 — Устарело. Вместо этого следует ожидать событие 'close'.

Возникает, когда запрос был прерван.

Событие: 'close'

История
Версия Изменения
v16.0.0

Событие close теперь возникает, когда запрос завершен, а не когда закрывается базовый сокет.

v0.4.2

Добавлено в: v0.4.2

Возникает, когда запрос завершен.

message.aborted

Добавлено в: v10.1.0Устарело с: v17.0.0, v16.12.0
Стабильность: 0 — Устарело. Проверяйте message.destroyed у <stream.Readable>.
  • Тип: <boolean>

Свойство message.aborted будет иметь значение true, если запрос был прерван.

message.complete

Добавлено в: v0.3.0
  • Тип: <boolean>

Свойство message.complete будет иметь значение true, если полное HTTP-сообщение было получено и успешно разобрано.

Это свойство особенно полезно для определения того, полностью ли клиент или сервер передал сообщение до разрыва соединения:

const req = http.request({
  host: '127.0.0.1',
  port: 8080,
  method: 'POST',
}, (res) => {
  res.resume();
  res.on('end', () => {
    if (!res.complete)
      console.error(
        'The connection was terminated while the message was still being sent');
  });
}); copy

message.connection

Добавлено в: v0.1.90Устарело с: v16.0.0
Стабильность: 0 — Устарело. Используйте message.socket.

Псевдоним для message.socket.

message.destroy([error])

История
Версия Изменения
v14.5.0, v12.19.0

Функция возвращает this для согласованности с другими потоками Readable.

v0.3.0

Добавлено в: v0.3.0

  • error <Error>
  • Возвращает: <this>

Вызывает destroy() для сокета, получившего IncomingMessage. Если задано error, в сокете возникает событие 'error', а error передается в качестве аргумента всем обработчикам этого события.

message.headers

История
Версия Изменения
v19.5.0, v18.14.0

Параметр joinDuplicateHeaders в функциях http.request() и http.createServer() гарантирует, что дублирующиеся заголовки не отбрасываются, а объединяются с помощью запятой в соответствии с разделом 5.3 RFC 9110.

v15.1.0

Значение message.headers теперь вычисляется отложенно с помощью свойства-аксессора в прототипе и больше не является перечисляемым.

v0.1.5

Добавлено в: v0.1.5

  • Тип: <Object>

Объект заголовков запроса/ответа.

Пары «ключ-значение», содержащие имена и значения заголовков. Имена заголовков приводятся к нижнему регистру.

// Prints something like:
//
// { 'user-agent': 'curl/7.22.0',
//   host: '127.0.0.1:8000',
//   accept: '*/*' }
console.log(request.headers); copy

Дубликаты в исходных заголовках обрабатываются следующим образом в зависимости от имени заголовка:

  • Дубликаты age, authorization, content-length, content-type, etag, expires, from, host, if-modified-since, if-unmodified-since, last-modified, location, max-forwards, proxy-authorization, referer, retry-after, server или user-agent отбрасываются. Чтобы разрешить объединение повторяющихся значений перечисленных выше заголовков, используйте параметр joinDuplicateHeaders в http.request() и http.createServer(). Дополнительную информацию см. в разделе 5.3 RFC 9110.
  • set-cookie всегда является массивом. Дубликаты добавляются в массив.
  • Значения дублирующихся заголовков cookie объединяются с помощью ; .
  • Значения всех остальных заголовков объединяются с помощью , .

message.headersDistinct

Добавлено в: v18.3.0, v16.17.0
  • Тип: <Object>

Аналогично message.headers, но объединение не выполняется, а значения всегда являются массивами строк, даже если заголовок получен только один раз.

// Prints something like:
//
// { 'user-agent': ['curl/7.22.0'],
//   host: ['127.0.0.1:8000'],
//   accept: ['*/*'] }
console.log(request.headersDistinct); copy

message.httpVersion

Добавлено в: v0.1.1
  • Тип: <string>

Для серверного запроса — версия HTTP, отправленная клиентом. Для ответа клиента — версия HTTP сервера, к которому установлено соединение. Вероятно, это либо '1.1', либо '1.0'.

Кроме того, message.httpVersionMajor — это первое целое число, а message.httpVersionMinor — второе.

message.method

Добавлено в: v0.1.1
  • Тип: <string>

Действительно только для запроса, полученного от http.Server.

Метод запроса в виде строки. Только для чтения. Примеры: 'GET', 'DELETE'.

message.rawHeaders

Добавлено в: v0.11.6
  • Тип: <string[]>

Исходный список заголовков запроса/ответа в точности в том виде, в котором они были получены.

Ключи и значения находятся в одном списке. Это не список кортежей. Таким образом, элементы с четными индексами содержат ключи, а элементы с нечетными индексами — соответствующие значения.

Имена заголовков не приводятся к нижнему регистру, а дубликаты не объединяются.

// Prints something like:
//
// [ 'user-agent',
//   'this is invalid because there can be only one',
//   'User-Agent',
//   'curl/7.22.0',
//   'Host',
//   '127.0.0.1:8000',
//   'ACCEPT',
//   '*/*' ]
console.log(request.rawHeaders); copy

message.rawTrailers

Добавлено в: v0.11.6
  • Тип: <string[]>

Исходные ключи и значения завершающих заголовков запроса/ответа в точности в том виде, в котором они были получены. Заполняется только при возникновении события 'end'.

message.setTimeout(msecs[, callback])

Добавлено в: v0.5.9
  • msecs <number>
  • callback <Function>
  • Возвращает: <http.IncomingMessage>

Вызывает message.socket.setTimeout(msecs, callback).

message.socket

Добавлено в: v0.3.0
  • Тип: <stream.Duplex>

Объект net.Socket, связанный с соединением.

При использовании HTTPS вызовите request.socket.getPeerCertificate(), чтобы получить сведения об аутентификации клиента.

Гарантируется, что это свойство является экземпляром класса <net.Socket>, подкласса <stream.Duplex>, если только пользователь не указал тип сокета, отличный от <net.Socket>, или если значение не было обнулено внутренним образом.

message.statusCode

Добавлено в: v0.1.1
  • Тип: <number>

Действительно только для ответа, полученного от http.ClientRequest.

Трехзначный код состояния HTTP-ответа. Например, 404.

message.statusMessage

Добавлено в: v0.11.10
  • Тип: <string>

Действительно только для ответа, полученного от http.ClientRequest.

Сообщение состояния HTTP-ответа (фраза причины). Например, OK или Internal Server Error.

message.trailers

Добавлено в: v0.3.0
  • Тип: <Object>

Объект завершающих заголовков запроса/ответа. Заполняется только при возникновении события 'end'.

message.trailersDistinct

Добавлено в: v18.3.0, v16.17.0
  • Тип: <Object>

Аналогично message.trailers, но объединение не выполняется, а значения всегда являются массивами строк, даже если заголовок получен только один раз. Заполняется только при возникновении события 'end'.

message.url

Добавлено в: v0.1.90
  • Тип: <string>

Действительно только для запроса, полученного от http.Server.

Строка URL запроса. Она содержит только URL, указанный непосредственно в HTTP-запросе. Рассмотрим следующий запрос:

GET /status?name=ryan HTTP/1.1
Accept: text/plain copy

Чтобы разобрать URL на составляющие:

new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`); copy

Если request.url имеет значение '/status?name=ryan', а process.env.HOST не задано:

$ node
> new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`);
URL {
  href: 'http://localhost/status?name=ryan',
  origin: 'http://localhost',
  protocol: 'http:',
  username: '',
  password: '',
  host: 'localhost',
  hostname: 'localhost',
  port: '',
  pathname: '/status',
  search: '?name=ryan',
  searchParams: URLSearchParams { 'name' => 'ryan' },
  hash: ''
} copy

Убедитесь, что для process.env.HOST задано имя хоста сервера, или рассмотрите возможность полной замены этой части. При использовании req.headers.host убедитесь, что выполняется надлежащая проверка, поскольку клиенты могут указать произвольный заголовок Host.

Класс: http.OutgoingMessage

Добавлено в: v0.1.17
  • Расширяет: <Stream>

Этот класс является родительским классом для http.ClientRequest и http.ServerResponse. С точки зрения участников HTTP-транзакции он представляет собой абстрактное исходящее сообщение.

Событие: 'drain'

Добавлено в: v0.3.6

Генерируется, когда буфер сообщения снова освобождается.

Событие: 'finish'

Добавлено в: v0.1.17

Генерируется после успешного завершения передачи.

Событие: 'prefinish'

Добавлено в: v0.11.6

Генерируется после вызова outgoingMessage.end(). При генерации события все данные обработаны, но не обязательно полностью отправлены.

outgoingMessage.addTrailers(headers)

Добавлено в: v0.3.0
  • headers <Object>

Добавляет к сообщению HTTP-трейлеры (заголовки в конце сообщения).

Трейлеры будут отправлены только в том случае, если сообщение передается с кодированием по частям. В противном случае трейлеры будут молча отброшены.

Для отправки трейлеров HTTP требует указать заголовок Trailer со списком имен полей заголовков в его значении, например:

message.writeHead(200, { 'Content-Type': 'text/plain',
                         'Trailer': 'Content-MD5' });
message.write(fileData);
message.addTrailers({ 'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667' });
message.end(); copy

Попытка задать имя или значение поля заголовка, содержащие недопустимые символы, приведет к выбросу TypeError.

outgoingMessage.appendHeader(name, value)

Добавлено в: v18.3.0, v16.17.0
  • name <string> Имя заголовка
  • value <string> | <string[]> Значение заголовка
  • Возвращает: <this>

Добавляет одно значение заголовка в объект заголовков.

Если значение является массивом, это равносильно многократному вызову данного метода.

Если для заголовка не было задано предыдущих значений, это равносильно вызову outgoingMessage.setHeader(name, value).

В зависимости от значения options.uniqueHeaders на момент создания клиентского запроса или сервера заголовок будет отправлен несколько раз либо один раз со значениями, объединенными с помощью ; .

outgoingMessage.connection

Добавлено в: v0.3.0Устарело с версии: v15.12.0, v14.17.1
Стабильность: 0 — Устарело: вместо этого используйте outgoingMessage.socket.

Псевдоним outgoingMessage.socket.

outgoingMessage.cork()

Добавлено в: v13.2.0, v12.16.0

См. writable.cork().

outgoingMessage.destroy([error])

Добавлено в: v0.3.0
  • error <Error> Необязательная ошибка, передаваемая вместе с событием error
  • Возвращает: <this>

Уничтожает сообщение. Если с сообщением связан сокет и он подключен, этот сокет также будет уничтожен.

outgoingMessage.end(chunk[, encoding][, callback])

История
Версия Изменения
v15.0.0

Параметр chunk теперь может быть типа Uint8Array.

v0.11.6

Добавлен аргумент callback.

v0.1.90

Добавлено в: v0.1.90

  • chunk <string> | <Buffer> | <Uint8Array>
  • encoding <string> Необязательный, по умолчанию: utf8
  • callback <Function> Необязательный
  • Возвращает: <this>

Завершает исходящее сообщение. Если какие-либо части тела еще не отправлены, они будут переданы в нижележащую систему. Если сообщение передается с кодированием по частям, будет отправлен завершающий фрагмент 0\r\n\r\n, а также трейлеры (если есть).

Если указан chunk, это равносильно вызову outgoingMessage.write(chunk, encoding), за которым следует outgoingMessage.end(callback).

Если указан callback, он будет вызван после завершения сообщения (это равносильно обработчику события 'finish').

outgoingMessage.flushHeaders()

Добавлено в: v1.6.0

Отправляет заголовки сообщения.

Для повышения эффективности Node.js обычно буферизует заголовки сообщения до вызова outgoingMessage.end() или записи первого фрагмента данных сообщения. Затем Node.js пытается объединить заголовки и данные в один TCP-пакет.

Обычно это желательно (так как позволяет избежать одного цикла обмена данными по TCP), но не в тех случаях, когда первые данные отправляются лишь спустя длительное время. outgoingMessage.flushHeaders() отключает оптимизацию и инициирует отправку сообщения.

outgoingMessage.getHeader(name)

Добавлено в: v0.4.0
  • name <string> Имя заголовка
  • Возвращает: <string> | <undefined>

Возвращает значение HTTP-заголовка с указанным именем. Если такой заголовок не задан, возвращаемым значением будет undefined.

outgoingMessage.getHeaderNames()

Добавлено в: v7.7.0
  • Возвращает: <string[]>

Возвращает массив с уникальными именами текущих исходящих заголовков. Все имена записаны в нижнем регистре.

outgoingMessage.getHeaders()

Добавлено в: v7.7.0
  • Возвращает: <Object>

Возвращает поверхностную копию текущих исходящих заголовков. Поскольку используется поверхностная копия, значения массивов можно изменять без дополнительных вызовов различных методов HTTP-модуля, связанных с заголовками. Ключами возвращаемого объекта являются имена заголовков, а значениями — соответствующие значения заголовков. Все имена заголовков записаны в нижнем регистре.

Объект, возвращаемый методом outgoingMessage.getHeaders(), не наследуется по прототипу от JavaScript-объекта Object. Это означает, что стандартные методы Object, такие как obj.toString(), obj.hasOwnProperty() и другие, не определены и не будут работать.

outgoingMessage.setHeader('Foo', 'bar');
outgoingMessage.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);

const headers = outgoingMessage.getHeaders();
// headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } copy

outgoingMessage.hasHeader(name)

Добавлено в: v7.7.0
  • name <string>
  • Возвращает: <boolean>

Возвращает true, если заголовок с именем name в данный момент задан в исходящих заголовках. Регистр букв в имени заголовка не учитывается.

const hasContentType = outgoingMessage.hasHeader('content-type'); copy

outgoingMessage.headersSent

Добавлено в: v0.9.3
  • Тип: <boolean>

Только для чтения. true, если заголовки были отправлены, иначе — false.

outgoingMessage.pipe()

Добавлено в: v9.0.0

Переопределяет метод stream.pipe(), унаследованный от устаревшего класса Stream, который является родительским классом для http.OutgoingMessage.

Вызов этого метода приведет к выбросу Error, поскольку outgoingMessage — это поток, доступный только для записи.

outgoingMessage.removeHeader(name)

Добавлено в: v0.4.0
  • name <string> Имя заголовка

Удаляет заголовок, поставленный в очередь для неявной отправки.

outgoingMessage.removeHeader('Content-Encoding'); copy

outgoingMessage.setHeader(name, value)

Добавлено в: v0.4.0
  • name <string> Имя заголовка
  • value <any> Значение заголовка
  • Возвращает: <this>

Задает одно значение заголовка. Если такой заголовок уже есть среди заголовков, ожидающих отправки, его значение будет заменено. Чтобы отправить несколько заголовков с одинаковым именем, используйте массив строк.

outgoingMessage.setHeaders(headers)

Добавлено в: v19.6.0, v18.15.0
  • headers <Headers> | <Map>
  • Возвращает: <this>

Задает несколько значений заголовков для неявных заголовков. headers должен быть экземпляром Headers или Map. Если такой заголовок уже есть среди заголовков, ожидающих отправки, его значение будет заменено.

const headers = new Headers({ foo: 'bar' });
outgoingMessage.setHeaders(headers); copy

или

const headers = new Map([['foo', 'bar']]);
outgoingMessage.setHeaders(headers); copy

Если заголовки заданы с помощью outgoingMessage.setHeaders(), они объединяются с любыми заголовками, переданными в response.writeHead(). При этом приоритет имеют заголовки, переданные в response.writeHead().

// Returns content-type = text/plain
const server = http.createServer((req, res) => {
  const headers = new Headers({ 'Content-Type': 'text/html' });
  res.setHeaders(headers);
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('ok');
}); copy

outgoingMessage.setTimeout(msecs[, callback])

Добавлено в: v0.9.12
  • msecs <number>
  • callback <Function> Необязательная функция, вызываемая при возникновении тайм-аута. Аналогична привязке к событию timeout.
  • Возвращает: <this>

Когда с сообщением связывается подключенный сокет, будет вызван метод socket.setTimeout(), которому в качестве первого параметра будет передано значение msecs.

outgoingMessage.socket

Добавлено в: v0.3.0
  • Тип: <stream.Duplex>

Ссылка на нижележащий сокет. Обычно пользователям не требуется обращаться к этому свойству.

После вызова outgoingMessage.end() этому свойству будет присвоено значение null.

outgoingMessage.uncork()

Добавлено в: v13.2.0, v12.16.0

См. writable.uncork()

outgoingMessage.writableCorked

Добавлено в: v13.2.0, v12.16.0
  • Тип: <number>

Количество вызовов outgoingMessage.cork().

outgoingMessage.writableEnded

Добавлено в: v12.9.0
  • Тип: <boolean>

Имеет значение true, если был вызван outgoingMessage.end(). Это свойство не указывает, были ли данные отправлены. Для этой цели используйте message.writableFinished.

outgoingMessage.writableFinished

Добавлено в: v12.7.0
  • Тип: <boolean>

Имеет значение true, если все данные отправлены в нижележащую систему.

outgoingMessage.writableHighWaterMark

Добавлено в: v12.9.0
  • Тип: <number>

Значение highWaterMark нижележащего сокета, если он назначен. В противном случае — уровень буфера по умолчанию, при котором writable.write() начинает возвращать false (16384).

outgoingMessage.writableLength

Добавлено в: v12.9.0
  • Тип: <number>

Количество байтов в буфере.

outgoingMessage.writableObjectMode

Добавлено в: v12.9.0
  • Тип: <boolean>

Всегда равно false.

outgoingMessage.write(chunk[, encoding][, callback])

История
Версия Изменения
v15.0.0

Параметр chunk теперь может быть типа Uint8Array.

v0.11.6

Добавлен аргумент callback.

v0.1.29

Добавлено в: v0.1.29

  • chunk <string> | <Buffer> | <Uint8Array>
  • encoding <string> По умолчанию: utf8
  • callback <Function>
  • Возвращает: <boolean>

Отправляет фрагмент тела сообщения. Этот метод можно вызывать несколько раз.

Аргумент encoding имеет значение только в том случае, если chunk является строкой. По умолчанию используется 'utf8'.

Аргумент callback необязателен и будет вызван после отправки этого фрагмента данных.

Возвращает true, если все данные успешно отправлены в буфер ядра. Возвращает false, если все данные или их часть помещены в очередь в памяти пользователя. Когда буфер снова освободится, будет сгенерировано событие 'drain'.

http.METHODS

Добавлено в: v0.11.8
  • Тип: <string[]>

Список HTTP-методов, поддерживаемых парсером.

http.STATUS_CODES

Добавлено в: v0.1.22
  • Тип: <Object>

Набор всех стандартных кодов состояния HTTP-ответов и краткое описание каждого из них. Например, http.STATUS_CODES[404] === 'Not Found'.

http.createServer([options][, requestListener])

История
Версия Изменения
v20.1.0, v18.17.0

Теперь поддерживается параметр highWaterMark.

v18.0.0

Теперь поддерживаются параметры requestTimeout, headersTimeout, keepAliveTimeout и connectionsCheckingInterval.

v18.0.0

Значение параметра noDelay по умолчанию теперь равно true.

v17.7.0, v16.15.0

Теперь поддерживаются параметры noDelay, keepAlive и keepAliveInitialDelay.

v13.3.0

Теперь поддерживается параметр maxHeaderSize.

v13.8.0, v12.15.0, v10.19.0

Теперь поддерживается параметр insecureHTTPParser.

v9.6.0, v8.12.0

Теперь поддерживается аргумент options.

v0.1.13

Добавлено в: v0.1.13

  • options <Object>

    • connectionsCheckingInterval: Задает интервал в миллисекундах для проверки тайм-аутов запроса и заголовков в незавершенных запросах. По умолчанию: 30000.
    • headersTimeout: Задает время ожидания в миллисекундах для получения всех HTTP-заголовков от клиента. Дополнительные сведения см. в разделе server.headersTimeout. По умолчанию: 60000.
    • highWaterMark <number> При необходимости переопределяет значения sockets' readableHighWaterMark и writableHighWaterMark. Это влияет на свойство highWaterMark как у IncomingMessage, так и у ServerResponse. По умолчанию: см. stream.getDefaultHighWaterMark().
    • insecureHTTPParser <boolean> Если задано значение true, используется HTTP-парсер с включенными флагами послаблений. Следует избегать использования небезопасного парсера. Дополнительные сведения см. в разделе --insecure-http-parser. По умолчанию: false.
    • IncomingMessage <http.IncomingMessage> Указывает используемый класс IncomingMessage. Полезно для расширения исходного IncomingMessage. По умолчанию: IncomingMessage.
    • joinDuplicateHeaders <boolean> Если задано значение true, значения строк полей нескольких заголовков запроса объединяются запятой (, ), а не отбрасываются как дубликаты. Дополнительные сведения см. в разделе message.headers. По умолчанию: false.
    • keepAlive <boolean> Если задано значение true, функция keep-alive включается для сокета сразу после получения нового входящего соединения, аналогично тому, как это делается в [socket.setKeepAlive([enable][, initialDelay])][socket.setKeepAlive(enable, initialDelay)]. По умолчанию: false.
    • keepAliveInitialDelay <number> Если задано положительное число, оно устанавливает начальную задержку перед отправкой первого зондирующего пакета keepalive через бездействующий сокет. По умолчанию: 0.
    • keepAliveTimeout: Время бездействия в миллисекундах, в течение которого сервер ожидает дополнительные входящие данные после завершения отправки последнего ответа, прежде чем сокет будет уничтожен. Дополнительные сведения см. в разделе server.keepAliveTimeout. По умолчанию: 5000.
    • maxHeaderSize <number> При необходимости переопределяет значение --max-http-header-size для запросов, получаемых этим сервером, то есть максимальную длину заголовков запроса в байтах. По умолчанию: 16384 (16 КиБ).
    • noDelay <boolean> Если задано значение true, алгоритм Нейгла отключается сразу после получения нового входящего соединения. По умолчанию: true.
    • requestTimeout: Задает время ожидания в миллисекундах для получения всего запроса от клиента. Дополнительные сведения см. в разделе server.requestTimeout. По умолчанию: 300000.
    • requireHostHeader <boolean> Если задано значение true, сервер будет отвечать кодом состояния 400 (Bad Request) на любой запрос HTTP/1.1 без заголовка Host (как того требует спецификация). По умолчанию: true.
    • ServerResponse <http.ServerResponse> Указывает используемый класс ServerResponse. Полезно для расширения исходного ServerResponse. По умолчанию: ServerResponse.
    • uniqueHeaders <Array> Список заголовков ответа, которые следует отправлять только один раз. Если значение заголовка является массивом, его элементы объединяются с помощью ; .
    • rejectNonStandardBodyWrites <boolean> Если задано значение true, при записи в HTTP-ответ без тела выбрасывается ошибка. По умолчанию: false.
  • requestListener <Function>

  • Возвращает: <http.Server>

Возвращает новый экземпляр http.Server.

Функция requestListener автоматически добавляется к событию 'request'.

Модули JavaScript
import http from 'node:http';

// Create a local server to receive data from
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000);
CommonJS
const http = require('node:http');

// Create a local server to receive data from
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000);
Модули JavaScript
import http from 'node:http';

// Create a local server to receive data from
const server = http.createServer();

// Listen to the request event
server.on('request', (request, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000);
CommonJS
const http = require('node:http');

// Create a local server to receive data from
const server = http.createServer();

// Listen to the request event
server.on('request', (request, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000);

http.get(options[, callback])

http.get(url[, options][, callback])

История
Версия Изменения
v10.9.0

Параметр url теперь можно передавать вместе с отдельным объектом options.

v7.5.0

Параметр options может быть объектом WHATWG URL.

v0.3.6

Добавлено в: v0.3.6

  • url <string> | <URL>
  • options <Object> Принимает те же options, что и http.request(); по умолчанию используется метод GET.
  • callback <Function>
  • Возвращает: <http.ClientRequest>

Поскольку большинство запросов — это запросы GET без тела, Node.js предоставляет этот вспомогательный метод. Единственное отличие этого метода от http.request() состоит в том, что он по умолчанию задает метод GET и автоматически вызывает req.end(). По причинам, изложенным в разделе http.ClientRequest, функция обратного вызова должна обработать данные ответа.

Функция callback вызывается с одним аргументом — экземпляром http.IncomingMessage.

Пример получения JSON:

http.get('http://localhost:8000/', (res) => {
  const { statusCode } = res;
  const contentType = res.headers['content-type'];

  let error;
  // Any 2xx status code signals a successful response but
  // here we're only checking for 200.
  if (statusCode !== 200) {
    error = new Error('Request Failed.\n' +
                      `Status Code: ${statusCode}`);
  } else if (!/^application\/json/.test(contentType)) {
    error = new Error('Invalid content-type.\n' +
                      `Expected application/json but received ${contentType}`);
  }
  if (error) {
    console.error(error.message);
    // Consume response data to free up memory
    res.resume();
    return;
  }

  res.setEncoding('utf8');
  let rawData = '';
  res.on('data', (chunk) => { rawData += chunk; });
  res.on('end', () => {
    try {
      const parsedData = JSON.parse(rawData);
      console.log(parsedData);
    } catch (e) {
      console.error(e.message);
    }
  });
}).on('error', (e) => {
  console.error(`Got error: ${e.message}`);
});

// Create a local server to receive data from
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!',
  }));
});

server.listen(8000); copy

http.globalAgent

История
Версия Изменения
v19.0.0

Теперь агент по умолчанию использует HTTP Keep-Alive и тайм-аут в 5 секунд.

v0.5.9

Добавлено в: v0.5.9

  • Тип: <http.Agent>

Глобальный экземпляр Agent, используемый по умолчанию для всех HTTP-запросов клиента. Отличается от стандартной конфигурации Agent тем, что keepAlive включён, а timeout равен 5 секундам.

http.maxHeaderSize

Добавлено в: v11.6.0, v10.15.0
  • Тип: <number>

Доступное только для чтения свойство, задающее максимальный допустимый размер HTTP-заголовков в байтах. По умолчанию — 16 КиБ. Настраивается с помощью параметра CLI --max-http-header-size.

Это значение можно переопределить для серверов и клиентских запросов, передав параметр maxHeaderSize.

http.request(options[, callback])

http.request(url[, options][, callback])

История
Версия Изменения
v16.7.0, v14.18.0

При использовании объекта URL разобранные имя пользователя и пароль теперь будут корректно декодироваться из URI.

v15.3.0, v14.17.0

Теперь запрос можно прервать с помощью AbortSignal.

v13.3.0

Теперь поддерживается параметр maxHeaderSize.

v13.8.0, v12.15.0, v10.19.0

Теперь поддерживается параметр insecureHTTPParser.

v10.9.0

Теперь параметр url можно передавать вместе с отдельным объектом options.

v7.5.0

Параметр options может быть объектом WHATWG URL.

v0.3.6

Добавлено в: v0.3.6

  • url <string> | <URL>
  • options <Object>
    • agent <http.Agent> | <boolean> Управляет поведением Agent. Возможные значения:
      • undefined (по умолчанию): использовать http.globalAgent для этого хоста и порта.
      • Agent объект: явно использовать переданный Agent.
      • false: использовать новый Agent со значениями по умолчанию.
    • auth <string> Базовая аутентификация ('user:password') для формирования заголовка Authorization.
    • createConnection <Function> Функция, создающая сокет/поток для запроса, если параметр agent не используется. Это позволяет не создавать пользовательский класс Agent только ради переопределения функции createConnection по умолчанию. Подробнее см. agent.createConnection(). Допустимым возвращаемым значением является любой поток Duplex.
    • defaultPort <number> Порт протокола по умолчанию. По умолчанию: agent.defaultPort, если используется Agent, иначе undefined.
    • family <number> Семейство IP-адресов, используемое при разрешении host или hostname. Допустимые значения: 4 или 6. Если значение не задано, используются адреса IPv4 и IPv6.
    • headers <Object> | <Array> Объект или массив строк, содержащий заголовки запроса. Формат массива совпадает с форматом message.rawHeaders.
    • hints <number> Необязательные dns.lookup() подсказки.
    • host <string> Доменное имя или IP-адрес сервера, которому отправляется запрос. По умолчанию: 'localhost'.
    • hostname <string> Псевдоним для host. Для поддержки url.parse() будет использоваться hostname, если указаны оба параметра — host и hostname.
    • insecureHTTPParser <boolean> Если установлено значение true, будет использоваться HTTP-парсер с включёнными флагами снисходительного разбора. Следует избегать использования небезопасного парсера. Дополнительные сведения см. в разделе --insecure-http-parser. По умолчанию: false
    • joinDuplicateHeaders <boolean> Объединяет значения строк нескольких заголовков запроса с помощью , вместо удаления дубликатов. Дополнительные сведения см. в разделе message.headers. По умолчанию: false.
    • localAddress <string> Локальный интерфейс для привязки сетевых подключений.
    • localPort <number> Локальный порт для подключения.
    • lookup <Function> Пользовательская функция поиска. По умолчанию: dns.lookup().
    • maxHeaderSize <number> Необязательное переопределение значения --max-http-header-size (максимальной длины заголовков ответа в байтах) для ответов, полученных от сервера. По умолчанию: 16384 (16 КиБ).
    • method <string> Строка, задающая метод HTTP-запроса. По умолчанию: 'GET'.
    • path <string> Путь запроса. При наличии строки запроса её следует включить. Например: '/index.html?page=12'. Если путь запроса содержит недопустимые символы, генерируется исключение. В настоящее время запрещены только пробелы, но в будущем это может измениться. По умолчанию: '/'.
    • port <number> Порт удалённого сервера. По умолчанию: defaultPort, если задан, иначе 80.
    • protocol <string> Используемый протокол. По умолчанию: 'http:'.
    • setDefaultHeaders <boolean>: указывает, нужно ли автоматически добавлять заголовки по умолчанию, такие как Connection, Content-Length, Transfer-Encoding и Host. Если задано значение false, все необходимые заголовки нужно добавить вручную. По умолчанию — true.
    • setHost <boolean>: указывает, нужно ли автоматически добавлять заголовок Host. Если задан, этот параметр переопределяет setDefaultHeaders. По умолчанию — true.
    • signal <AbortSignal>: AbortSignal, который можно использовать для прерывания выполняющегося запроса.
    • socketPath <string> Доменный сокет Unix. Не может использоваться, если задан один из параметров host или port, поскольку они задают TCP-сокет.
    • timeout <number>: число, задающее тайм-аут сокета в миллисекундах. Оно устанавливает тайм-аут до подключения сокета.
    • uniqueHeaders <Array> Список заголовков запроса, которые следует отправлять только один раз. Если значение заголовка является массивом, его элементы будут объединены с помощью ; .
  • callback <Function>
  • Возвращает: <http.ClientRequest>

Также поддерживаются options в socket.connect().

Node.js поддерживает несколько соединений с каждым сервером для выполнения HTTP-запросов. Эта функция позволяет отправлять запросы прозрачно.

url может быть строкой или объектом URL. Если url — строка, она автоматически разбирается с помощью new URL(). Если это объект URL, он автоматически преобразуется в обычный объект options.

Если указаны и url, и options, объекты объединяются, причём свойства options имеют приоритет.

Необязательный параметр callback будет добавлен как одноразовый обработчик события 'response'.

http.request() возвращает экземпляр класса http.ClientRequest. Экземпляр ClientRequest является потоком для записи. Если нужно загрузить файл с помощью POST-запроса, следует записать его в объект ClientRequest.

Модули JavaScript
import http from 'node:http';
import { Buffer } from 'node:buffer';

const postData = JSON.stringify({
  'msg': 'Hello World!',
});

const options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(postData),
  },
};

const req = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

// Write data to request body
req.write(postData);
req.end();
CommonJS
const http = require('node:http');

const postData = JSON.stringify({
  'msg': 'Hello World!',
});

const options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(postData),
  },
};

const req = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

// Write data to request body
req.write(postData);
req.end();

В примере был вызван req.end(). При использовании http.request() необходимо всегда вызывать req.end(), чтобы обозначить конец запроса, даже если в тело запроса ничего не записывается.

Если во время запроса возникает ошибка (при разрешении DNS, на уровне TCP или непосредственно при разборе HTTP), для возвращённого объекта запроса генерируется событие 'error'. Как и для всех событий 'error', если обработчики не зарегистрированы, ошибка будет выброшена.

Следует учитывать несколько особых заголовков.

  • Отправка заголовка 'Connection: keep-alive' сообщает Node.js, что соединение с сервером следует сохранять до следующего запроса.

  • Отправка заголовка 'Content-Length' отключает кодирование с разбиением на части, используемое по умолчанию.

  • Отправка заголовка 'Expect' приводит к немедленной отправке заголовков запроса. Обычно при отправке 'Expect: 100-continue' следует задать тайм-аут и обработчик события 'continue'. Дополнительные сведения см. в разделе 8.2.3 RFC 2616.

  • Отправка заголовка Authorization переопределяет использование параметра auth для вычисления базовой аутентификации.

Пример использования URL в качестве options:

const options = new URL('http://abc:xyz@example.com');

const req = http.request(options, (res) => {
  // ...
}); copy

При успешном запросе события будут сгенерированы в следующем порядке:

  • 'socket'
  • 'response'
    • 'data' любое количество раз для объекта res (событие 'data' не будет сгенерировано, если тело ответа пустое, например при большинстве перенаправлений)
    • 'end' для объекта res
  • 'close'

В случае ошибки соединения будут сгенерированы следующие события:

  • 'socket'
  • 'error'
  • 'close'

Если соединение неожиданно закрывается до получения ответа, события будут сгенерированы в следующем порядке:

  • 'socket'
  • 'error' с ошибкой с сообщением 'Error: socket hang up' и кодом 'ECONNRESET'
  • 'close'

Если соединение неожиданно закрывается после получения ответа, события будут сгенерированы в следующем порядке:

  • 'socket'
  • 'response'
    • 'data' любое количество раз для объекта res
  • (здесь соединение закрывается)
  • 'aborted' для объекта res
  • 'close'
  • 'error' для объекта res с ошибкой с сообщением 'Error: aborted' и кодом 'ECONNRESET'
  • 'close' для объекта res

Если req.destroy() вызывается до назначения сокета, события будут сгенерированы в следующем порядке:

  • (здесь вызван req.destroy())
  • 'error' с ошибкой с сообщением 'Error: socket hang up' и кодом 'ECONNRESET' либо с ошибкой, с которой был вызван req.destroy()
  • 'close'

Если req.destroy() вызывается до успешного установления соединения, события будут сгенерированы в следующем порядке:

  • 'socket'
  • (здесь вызван req.destroy())
  • 'error' с ошибкой с сообщением 'Error: socket hang up' и кодом 'ECONNRESET' либо с ошибкой, с которой был вызван req.destroy()
  • 'close'

Если req.destroy() вызывается после получения ответа, события будут сгенерированы в следующем порядке:

  • 'socket'
  • 'response'
    • 'data' любое количество раз для объекта res
  • (здесь вызван req.destroy())
  • 'aborted' для объекта res
  • 'close'
  • 'error' для объекта res с ошибкой с сообщением 'Error: aborted' и кодом 'ECONNRESET' либо с ошибкой, с которой был вызван req.destroy()
  • 'close' для объекта res

Если req.abort() вызывается до назначения сокета, события будут сгенерированы в следующем порядке:

  • (здесь вызван req.abort())
  • 'abort'
  • 'close'

Если req.abort() вызывается до успешного установления соединения, события будут сгенерированы в следующем порядке:

  • 'socket'
  • (здесь вызван req.abort())
  • 'abort'
  • 'error' с ошибкой с сообщением 'Error: socket hang up' и кодом 'ECONNRESET'
  • 'close'

Если req.abort() вызывается после получения ответа, события будут сгенерированы в следующем порядке:

  • 'socket'
  • 'response'
    • 'data' любое количество раз для объекта res
  • (здесь вызван req.abort())
  • 'abort'
  • 'aborted' для объекта res
  • 'error' для объекта res с ошибкой с сообщением 'Error: aborted' и кодом 'ECONNRESET'.
  • 'close'
  • 'close' для объекта res

Установка параметра timeout или использование функции setTimeout() не прерывает запрос и не приводит ни к чему, кроме добавления события 'timeout'.

Передача AbortSignal и последующий вызов abort() для соответствующего AbortController приведут к тому же поведению, что и вызов .destroy() для запроса. В частности, будет сгенерировано событие 'error' с ошибкой с сообщением 'AbortError: The operation was aborted', кодом 'ABORT_ERR' и объектом cause, если он был передан.

http.validateHeaderName(name[, label])

История
Версия Изменения
v19.5.0, v18.14.0

Добавлен параметр label.

v14.3.0

Добавлено в: v14.3.0

  • name <string>
  • label <string> Метка для сообщения об ошибке. По умолчанию: 'Header name'.

Выполняет низкоуровневую проверку переданного name, такую же, как при вызове res.setHeader(name, value).

Передача недопустимого значения в качестве name приведёт к выбросу TypeError с идентификатором code: 'ERR_INVALID_HTTP_TOKEN'.

Нет необходимости вызывать этот метод перед передачей заголовков HTTP-запросу или ответу. Модуль HTTP автоматически проверяет такие заголовки.

Пример:

Модули JavaScript
import { validateHeaderName } from 'node:http';

try {
  validateHeaderName('');
} catch (err) {
  console.error(err instanceof TypeError); // --> true
  console.error(err.code); // --> 'ERR_INVALID_HTTP_TOKEN'
  console.error(err.message); // --> 'Header name must be a valid HTTP token [""]'
}
CommonJS
const { validateHeaderName } = require('node:http');

try {
  validateHeaderName('');
} catch (err) {
  console.error(err instanceof TypeError); // --> true
  console.error(err.code); // --> 'ERR_INVALID_HTTP_TOKEN'
  console.error(err.message); // --> 'Header name must be a valid HTTP token [""]'
}

http.validateHeaderValue(name, value)

Добавлено в: v14.3.0
  • name <string>
  • value <any>

Выполняет низкоуровневую проверку переданного value, такую же, как при вызове res.setHeader(name, value).

Передача недопустимого значения в качестве value приведёт к выбросу TypeError.

  • Ошибка неопределённого значения идентифицируется по code: 'ERR_HTTP_INVALID_HEADER_VALUE'.
  • Ошибка недопустимого символа в значении идентифицируется по code: 'ERR_INVALID_CHAR'.

Нет необходимости вызывать этот метод перед передачей заголовков HTTP-запросу или ответу. Модуль HTTP автоматически проверяет такие заголовки.

Примеры:

Модули JavaScript
import { validateHeaderValue } from 'node:http';

try {
  validateHeaderValue('x-my-header', undefined);
} catch (err) {
  console.error(err instanceof TypeError); // --> true
  console.error(err.code === 'ERR_HTTP_INVALID_HEADER_VALUE'); // --> true
  console.error(err.message); // --> 'Invalid value "undefined" for header "x-my-header"'
}

try {
  validateHeaderValue('x-my-header', 'oʊmɪɡə');
} catch (err) {
  console.error(err instanceof TypeError); // --> true
  console.error(err.code === 'ERR_INVALID_CHAR'); // --> true
  console.error(err.message); // --> 'Invalid character in header content ["x-my-header"]'
}
CommonJS
const { validateHeaderValue } = require('node:http');

try {
  validateHeaderValue('x-my-header', undefined);
} catch (err) {
  console.error(err instanceof TypeError); // --> true
  console.error(err.code === 'ERR_HTTP_INVALID_HEADER_VALUE'); // --> true
  console.error(err.message); // --> 'Invalid value "undefined" for header "x-my-header"'
}

try {
  validateHeaderValue('x-my-header', 'oʊmɪɡə');
} catch (err) {
  console.error(err instanceof TypeError); // --> true
  console.error(err.code === 'ERR_INVALID_CHAR'); // --> true
  console.error(err.message); // --> 'Invalid character in header content ["x-my-header"]'
}

http.setMaxIdleHTTPParsers(max)

Добавлено в: v18.8.0, v16.18.0
  • max <number> По умолчанию: 1000.

Задаёт максимальное количество неактивных HTTP-парсеров.

Класс: WebSocket

Добавлено в: v22.5.0

Реализация <WebSocket>, совместимая с браузерами.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/http.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API