JS: HTTP Server
Теория: Запрос
После того, как клиент делает запрос на сервер, node.js формирует объект
request и передает его в наш обработчик. Request является инстансом
IncomingMessage и содержит всю возможную информацию о соединении.
Нас интересует только небольшая часть этих данных.
Важно упомянуть, что все заголовки в объекте headers представлены в нижнем регистре,
причём не важно, в каком виде они были посланы на сервер. Это сильно упрощает
дальнейшую работу с заголовками. Если некоторые заголовки повторяются, их значения
будут перезаписаны или объединены в строчки разделённые точкой запятой, в зависимости
от заголовка. В некоторых случаях это может быть нежелательным, поэтому всегда
можно получить сырые заголовки, используя объект rawHeaders.
С одной стороны видно, что здесь есть все параметры запроса, с другой – есть маленькие
неудобства. Выражаются они в том, что http не предоставляет возможность
получить query params в виде объекта js.
Для этого мы можем создать объект URL
и воспользоваться его свойством searchParams.
Существует и другой способ работы с сервером ноды:
Как и многое другое в node.js, сервер является EventEmitter. Событие request
соответствует входящему запросу.
Request EventEmitter
Объект Request так же является EventEmitter. Изучим подробнее генерируемые
им события.
end
Событие end генерируется в тот момент, когда запрос целиком получен. Обычно
обработчик именно на это событие содержит логику обработки запроса.
error
В случае ошибок это будет событие error. Если это событие не будет прослушано,
то возникшая ошибка превращается в исключение, что приведёт к падению программы.
Таким образом, будет хорошей практикой всегда слушать это событие и, как минимум,
логгировать его, а еще лучше отвечать вызывающей стороне правильным кодом ошибки.
data
Событие, которое вызывается при получении данных. Будет рассматриваться в соответствующем уроке.
В случае, если данные не принимаются и это событие не слушается, необходимо обязательно делать
вызов метода resume на объекте request, иначе запрос не начнёт обрабатываться.
Response
В общем виде запись ответа в response выглядит так:
или так:
То есть в зависимости от ситуации можно передавать данные либо сразу в end,
либо, если они большие, отдавать порциями через write.
По умолчанию код ответа всегда 200. Конечно, не каждому запросу гарантируется
такой ответ, в некоторых случаях нужно отправлять совсем другой код. Самый
простой способ сделать это - напрямую поменять свойство statusCode.
Установка заголовков делается уже через специальный метод:
Важно не забывать установить все заголовки до того, как начнёт отправляться тело.
Это логично, ведь заголовки в http идут перед телом, а поменять порядок после
отправки уже нельзя.