Что такое протокол HTTP и как он работает
Что проверяют
Понимаете ли вы протокол на том уровне, на котором с ним работает Node: без фреймворка запрос и ответ это потоки, а не готовые объекты. Проверяют знание структуры сообщения, семантики методов и кодов, и понимание того, что происходит с соединением после ответа.
Как отвечать
HTTP это текстовый протокол запроса и ответа поверх TCP, без состояния: сервер не помнит предыдущий запрос, состояние переносят cookie и токены. Сообщение состоит из стартовой строки, заголовков, пустой строки и тела.
Что назвать по существу:
методы и их свойства: GET и HEAD безопасны, PUT и DELETE идемпотентны, POST нет, и от этого зависит, можно ли повторять запрос после сбоя;
классы кодов: 2xx успех, 3xx перенаправление, 4xx ошибка клиента, 5xx ошибка сервера;
заголовки, которые решают дело: Content-Type, Content-Length против Transfer-Encoding: chunked, Cache-Control и ETag, Authorization;
версии: в HTTP/1.1 соединение переиспользуется, в HTTP/2 запросы мультиплексируются в одном соединении и заголовки сжимаются, HTTP/3 переезжает на QUIC поверх UDP.
Специфика Node: тело не разбирается само, его читают из потока или отдают дальше по конвейеру; имена заголовков приходят в нижнем регистре; менять заголовки можно только до первой записи в тело; у сервера отдельно настраиваются таймаут на заголовки и на запрос целиком.
Где спотыкаются
Отвечают кодом 2xx и полем с ошибкой в теле. Для клиента, кэша, балансировщика и мониторинга это успех, поэтому ретраев не будет, а графики останутся зелёными при неработающем сервисе.
Пишут в ответ после его завершения или ставят заголовок после первой записи тела. Ответ это поток, заголовки уже ушли, и приложение получает ошибку об отправленных заголовках в обработчике, который выглядит правильным.
Не дочитывают тело запроса или ответа до конца. Сокет не возвращается в пул постоянного соединения, дескрипторы копятся, и под нагрузкой сервис упирается в лимит вместо того, чтобы упереться в процессор.