Ответ FetchAPI на сбой DNS

#javascript #browser #chromium

Вопрос:

Я пытаюсь что-то вроде:

 const resp = await fetch('http://bad-domain'); //bad-domain does not resolve
 

Затем я обнаруживаю исключение позже в своем коде, которое гласит::
TypeError: failed to fetch

Является ли это ожидаемым результатом неудачного поиска DNS или это связано с resp тем, что он отличается от обычного Response объекта, fetch возвращаемого без ошибок.

Просто это TypeError явно не указывает на то, что проблема заключается в плохом сетевом запросе, а не в плохом коде javascript.

Ответ №1:

Это ожидаемое поведение:

12.3. Если ответом является сетевая ошибка, то отклоните p с помощью a TypeError и завершите эти подэтапы.

…где p — обещание, возвращенное fetch . Спецификация не требует предоставления какой-либо конкретной информации о том, почему запрос не удался, просто о том, что он не удался (на сетевом уровне; он не отклоняется при ошибках HTTP, как я описываю здесь в своем старом анемичном блоге, вы должны проверить это на пути выполнения).

Комментарии:

1. (FWIW, использование TypeError для этого тоже кажется мне странным, но тогда это не единственная моя проблема с fetch API [см. Ссылку выше].)

2. Спасибо за каноническую ссылку. Я просмотрел спецификацию, но, должно быть, пропустил ее. MDN также немного неясен

3. @дорон — О, ух ты, я только что посмотрел на developer.mozilla.org/en-US/docs/Web/API/fetch#exceptions и это не просто неясно, это совершенно неправильно или, по крайней мере, довольно вводит в заблуждение, предполагая, что вы получаете ошибку типа только тогда, когда в URL-адресе указаны учетные данные. У меня есть еще три правки MDN в моем списке на ближайшие пару недель, я добавлю к нему это. 🙂

4. @дорон — #9377 .

5. Хорошенькая. Спасибо