0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>После того, как клиент делает запрос на сервер, node.js формирует объект request и передает его в наш обработчик. Request является инстансом IncomingMessage и содержит всю возможную информацию о соединении. Нас интересует только небольшая часть этих данных.</p>
1
<p>После того, как клиент делает запрос на сервер, node.js формирует объект request и передает его в наш обработчик. Request является инстансом IncomingMessage и содержит всю возможную информацию о соединении. Нас интересует только небольшая часть этих данных.</p>
2
<p>Важно упомянуть, что все заголовки в объекте headers представлены в нижнем регистре, причём не важно, в каком виде они были посланы на сервер. Это сильно упрощает дальнейшую работу с заголовками. Если некоторые заголовки повторяются, их значения будут перезаписаны или объединены в строчки разделённые точкой запятой, в зависимости от заголовка. В некоторых случаях это может быть нежелательным, поэтому всегда можно получить сырые заголовки, используя объект rawHeaders.</p>
2
<p>Важно упомянуть, что все заголовки в объекте headers представлены в нижнем регистре, причём не важно, в каком виде они были посланы на сервер. Это сильно упрощает дальнейшую работу с заголовками. Если некоторые заголовки повторяются, их значения будут перезаписаны или объединены в строчки разделённые точкой запятой, в зависимости от заголовка. В некоторых случаях это может быть нежелательным, поэтому всегда можно получить сырые заголовки, используя объект rawHeaders.</p>
3
<p>С одной стороны видно, что здесь есть все параметры запроса, с другой - есть маленькие неудобства. Выражаются они в том, что http не предоставляет возможность получить query params в виде объекта js. Для этого мы можем создать объект<a>URL</a>и воспользоваться его свойством searchParams.</p>
3
<p>С одной стороны видно, что здесь есть все параметры запроса, с другой - есть маленькие неудобства. Выражаются они в том, что http не предоставляет возможность получить query params в виде объекта js. Для этого мы можем создать объект<a>URL</a>и воспользоваться его свойством searchParams.</p>
4
<p>Существует и другой способ работы с сервером ноды:</p>
4
<p>Существует и другой способ работы с сервером ноды:</p>
5
<p>Как и многое другое в node.js, сервер является EventEmitter. Событие request соответствует входящему запросу.</p>
5
<p>Как и многое другое в node.js, сервер является EventEmitter. Событие request соответствует входящему запросу.</p>
6
<h2>Request EventEmitter</h2>
6
<h2>Request EventEmitter</h2>
7
<p>Объект Request так же является EventEmitter. Изучим подробнее генерируемые им события.</p>
7
<p>Объект Request так же является EventEmitter. Изучим подробнее генерируемые им события.</p>
8
<h3>end</h3>
8
<h3>end</h3>
9
<p>Событие end генерируется в тот момент, когда запрос целиком получен. Обычно обработчик именно на это событие содержит логику обработки запроса.</p>
9
<p>Событие end генерируется в тот момент, когда запрос целиком получен. Обычно обработчик именно на это событие содержит логику обработки запроса.</p>
10
<h3>error</h3>
10
<h3>error</h3>
11
<p>В случае ошибок это будет событие error. Если это событие не будет прослушано, то возникшая ошибка превращается в исключение, что приведёт к падению программы. Таким образом, будет хорошей практикой всегда слушать это событие и, как минимум, логгировать его, а еще лучше отвечать вызывающей стороне правильным кодом ошибки.</p>
11
<p>В случае ошибок это будет событие error. Если это событие не будет прослушано, то возникшая ошибка превращается в исключение, что приведёт к падению программы. Таким образом, будет хорошей практикой всегда слушать это событие и, как минимум, логгировать его, а еще лучше отвечать вызывающей стороне правильным кодом ошибки.</p>
12
<h3>data</h3>
12
<h3>data</h3>
13
<p>Событие, которое вызывается при получении данных. Будет рассматриваться в соответствующем уроке.</p>
13
<p>Событие, которое вызывается при получении данных. Будет рассматриваться в соответствующем уроке.</p>
14
<p>В случае, если данные не принимаются и это событие не слушается, необходимо обязательно делать вызов метода resume на объекте request, иначе запрос не начнёт обрабатываться.</p>
14
<p>В случае, если данные не принимаются и это событие не слушается, необходимо обязательно делать вызов метода resume на объекте request, иначе запрос не начнёт обрабатываться.</p>
15
<h2>Response</h2>
15
<h2>Response</h2>
16
<p>В общем виде запись ответа в response выглядит так:</p>
16
<p>В общем виде запись ответа в response выглядит так:</p>
17
<p>или так:</p>
17
<p>или так:</p>
18
<p>То есть в зависимости от ситуации можно передавать данные либо сразу в end, либо, если они большие, отдавать порциями через write.</p>
18
<p>То есть в зависимости от ситуации можно передавать данные либо сразу в end, либо, если они большие, отдавать порциями через write.</p>
19
<p>По умолчанию код ответа всегда 200. Конечно, не каждому запросу гарантируется такой ответ, в некоторых случаях нужно отправлять совсем другой код. Самый простой способ сделать это - напрямую поменять свойство statusCode.</p>
19
<p>По умолчанию код ответа всегда 200. Конечно, не каждому запросу гарантируется такой ответ, в некоторых случаях нужно отправлять совсем другой код. Самый простой способ сделать это - напрямую поменять свойство statusCode.</p>
20
<p>Установка заголовков делается уже через специальный метод:</p>
20
<p>Установка заголовков делается уже через специальный метод:</p>
21
<p>Важно не забывать установить все заголовки до того, как начнёт отправляться тело. Это логично, ведь заголовки в http идут перед телом, а поменять порядок после отправки уже нельзя.</p>
21
<p>Важно не забывать установить все заголовки до того, как начнёт отправляться тело. Это логично, ведь заголовки в http идут перед телом, а поменять порядок после отправки уже нельзя.</p>
22
<h2>Всё вместе</h2>
22
<h2>Всё вместе</h2>
23
23