TypeError: Failed to fetch
#Почему fetch не даёт код ответа
В отличие от ошибок 404 или 500, «Failed to fetch» появляется не при плохом ответе, а когда ответа нет совсем: fetch() отклоняет промис только при сетевом сбое или когда браузер сам запретил запрос. Поэтому текст ошибки мало что говорит, а причину надо искать в DevTools (F12 → вкладка Network) и в Console: рядом с этой ошибкой почти всегда есть красная строка с подробностью, например про CORS или блокировку расширением.
#Что чаще всего стоит за ошибкой
| Возможная причина | Как узнать | Что делать |
|---|---|---|
CORS без нужных заголовковСтраница на одном origin обращается к API на другом, а сервер не вернул Access-Control-Allow-Origin. | В Console есть строка «blocked by CORS policy», в Network запрос красный или со статусом (blocked). | Добавьте заголовок на сервере API или проксируйте запрос через свой бэкенд. |
| Смешанное содержимоеСтраница открыта по https, а запрос идёт на адрес с http. | В Console: «Mixed Content … requested an insecure resource». | Переведите API на https или используйте относительный путь. |
| Блокировщик или расширениеuBlock, AdGuard и антивирусные расширения режут адреса со словами ads, track, analytics. | Статус запроса net::ERR_BLOCKED_BY_CLIENT. | Откройте страницу в окне инкогнито или отключите расширение для сайта. |
| Сервер недоступен или неверный адресОпечатка в хосте, порт закрыт, сертификат просрочен, DNS не находит имя. | net::ERR_CONNECTION_REFUSED, ERR_NAME_NOT_RESOLVED или ERR_CERT_DATE_INVALID. | Проверьте адрес и доступность сервера командой curl. |
Обрыв до ответаПрокси или сервер закрыли соединение, истёк таймаут, запрос прерван AbortController. | Ошибка приходит случайно, на больших запросах. | Увеличьте таймаут, проверьте логи сервера. |
#Проверка по шагам
- Различите сетевой сбой и ответ HTTPВ браузере откройте F12 → Network, обновите страницу и повторите действие. Найдите запрос
fetch, запишите Request URL, статус и запись в Console. ОшибкаTypeError: Failed to fetchобычно означает, что браузер не получил доступный ответ (сеть, TLS, блокировка CORS), тогда как HTTP 404/500 сам по себе не заставляетfetch()отклонить обещание — статус нужно проверять отдельно черезresponse.ok. - Проверьте адрес запроса и сетевую доступностьСравните фактический адрес в Network с адресом своего API: протокол
https, домен, порт, путь и отсутствие опечаток. Откройте URL безопасного GET-запроса в новой вкладке либо проверьтеcurl -Iв терминале, если сервер поддерживает HEAD. Еслиcurlпоказывает TLS/DNS-ошибку, решайте её до изменения JavaScript. Не обходите проверку сертификата через-kили режимы браузера без защиты. - Если ошибка только в браузере, проверьте CORSВ Console ищите «blocked by CORS policy», а в Network — запрос OPTIONS. Сервер API (не клиент) должен разрешать конкретный
Origin, используемый метод и реальные заголовки. Если используются cookie сcredentials: "include", требуются точный Origin иAccess-Control-Allow-Credentials: true;*не подходит. Нельзя исправить CORS простым добавлениемAccess-Control-Allow-Originв заголовки клиентского запроса. - Исключите блокировку и смешанный протоколЕсли страница загружена по HTTPS, а API вызывается по HTTP, браузер может блокировать небезопасный запрос. Переведите API на рабочий HTTPS с действительным сертификатом. При наличии ошибки
ERR_BLOCKED_BY_CLIENTпроверьте расширения и политики браузера на тестовом профиле, не отключая защиту на рабочем компьютере. Для корпоративной сети уточните правила прокси у администратора. - Обрабатывайте исключение и статусы раздельноВ коде оберните
await fetch(url)вtry/catchи покажите сообщение о проблеме соединения при исключении. После успешногоfetchсначала проверьтеresponse.okи при ошибке сообщитеresponse.status, а затем разбирайте тело черезresponse.json(), если сервер действительно вернул JSON. Не пишите безусловноеawait response.json()для ответов 204 No Content. - Повторите запрос и убедитесь в результатеПосле устранения сетевой причины повторите действие. Успех — запрос виден в Network, ответ доступен JavaScript, нужные данные отображаются, в Console нет
Failed to fetch. При повторении сохраните метод, адрес без секретных параметров, текст ошибки и результат вкладки Network для разработчика. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Когда помогает режим no-cors
Параметр mode: 'no-cors' убирает ошибку, но превращает ответ в «непрозрачный»: прочитать тело нельзя. Он годится только для отправки данных вслепую (например, счётчик), а для чтения JSON нужен нормальный CORS на стороне сервера.