Какие возможны исходы и ошибки после получения запроса на сервере
Что проверяют
Понимаете ли вы, что у запроса бывают исходы помимо «успех» и «ошибка», и умеете ли различать их в клиентском коде. Следом почти всегда спрашивают, почему fetch не падает на 404 и когда запрос можно повторять.
Как отвечать
Разделите исходы на две группы: ответ пришёл или не пришёл вовсе.
- сетевой сбой: нет соединения, ошибка DNS, обрыв, блокировка CORS.
fetchотклоняет промис сTypeError, а причину CORS браузер скрывает, её видно только в консоли; - отмена и таймаут:
AbortControllerдаётAbortError,AbortSignal.timeout(ms)даётTimeoutError. Собственного таймаута уfetchнет; - 2xx:
response.okравенtrue. У204 No Contentтела нет, иresponse.json()на нём бросит исключение; - 3xx: редиректы браузер проходит сам, условные запросы с
304обслуживает HTTP-кеш; - 4xx: ошибка в запросе.
400и422это валидация,401нет аутентификации,403нет прав,404ресурса нет,409конфликт версий,429превышен лимит, смотрите заголовокRetry-After; - 5xx: сбой на сервере или шлюзе:
500,502,503,504.
Отдельно назовите случай «статус 200, но тело не то»: прокси вернул HTML-страницу вместо JSON, и падает уже парсинг.
Дальше про обработку. Повторять запрос имеет смысл при сетевом сбое, 429, 503 и 504, с экспоненциальной задержкой и только для идемпотентных методов. На 401 обновите токен или отправьте на вход, на 422 подсветите поля формы, на 5xx покажите понятное сообщение и кнопку повтора. Ответ, пришедший позже более свежего, отменяйте через AbortController, иначе поиск покажет результаты старого запроса.
Где спотыкаются
Считают, что fetch сам выбросит ошибку на 404 или 500. Он отклоняет промис только при сетевом сбое, статус проверяют через response.ok. У axios наоборот: по умолчанию он бросает исключение на любой статус вне 2xx.
Путают 401 и 403. Первый значит «кто вы?», второй «знаю, кто вы, но нельзя», и повторный вход тут не поможет.
Повторяют POST при любой ошибке. Без ключа идемпотентности это легко оборачивается двойным заказом или платежом.