Задать вопрос
@Raym0NT

Как убрать автоматический вывод ошибки в случае неудачного fetch запроса?

Добрый день, ситуация такая: Я делаю pet-project(Стартавая страница браузера) и в нем по плану есть добавление закладок(Как на стартовой странице браузера), и мне необходимо получить favicon сайта, для установки его как иконки, и в случае если пользователь указал не правильную ссылку(то favicon не получится получить), и я устанавливаю первую букву названия закладки как иконку. Я проверяю существует ли ссылка отправляя на нее fetch запрос, и в случае если ссылка существует, я беру у сайта favicon, в случае неудачи устанавливаю первую букву названия закладки на иконку, все ок, НО как убрать автоматический вывод ошибки у fetch запроса, в случае если ссылка не коректна и я устанавливаю первую букву названия, как иконку?
Cам код
// Добавление закладки в HTML и сохранение в localStorage
bookmarksForm.addEventListener("submit", e => {
  e.preventDefault();
  
  const bookmarkName = bookmarksFormName.value;
  const bookmarkLink =
    bookmarksFormLink.value.includes("https://") ||
    bookmarksFormLink.value.includes("http://")
      ? bookmarksFormLink.value
      : "https://" + bookmarksFormLink.value; // Есть ли в строке https или http протокол в случае если нет добавляется

  // Вывод самой закладки
  function outputBookmark(bookmarkItem) {
    // Создание элемента и вывод его в html сетку
    const li = document.createElement("li");
    li.classList.add("bookmarks__bookmark");
    li.innerHTML = bookmarkItem;
    grid.add(li);

    // Закрытие формы после успешного добавления
    bookmarksForm.classList.remove("bookmarks__form--open");
    modalOverlay.classList.remove("modal-overlay--open");

    // Очистка инпутов
    bookmarksFormName.value = "";
    bookmarksFormLink.value = "";

    // Сохранение в localStorage
    
  }

  // Таймер проверки ссылки(если fetch длится больше 1сек, тогда эта ссылка не валидна)
  const timeoutPromise = function (seconds) {
    return new Promise(function (_, reject) {
      setTimeout(() => {
        reject("test");
      }, seconds * 1000);
    });
  };

  if (bookmarkName && bookmarkLink.length > 8) {
    /* В случае если ссылка существует иконкой будет 
      Favicon приложения в ином случае первая буква name
    */

    // Если запрос больше секунды тогда это не валидная ссылка
    Promise.race([
      fetch(bookmarkLink, {
        mode: "no-cors",
      }),
      timeoutPromise(1),
    ]).then(
      // В случае успеха(если fetch загрузился быстрее timeoutPromise(1сек))
      e => {
        const bookmarkItem = `
                <div class="bookmarks__bookmark-content">
                  <a
                    href="${bookmarkLink}"
                    target="_blank"
                    class="bookmarks__bookmark-link"
                  >
                    <img
                      class="bookmarks__bookmark-icon"
                      src="https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${bookmarkLink}&size=64"
                    />
                    <span class="bookmarks__bookmark-name">${bookmarkName}</span>
                  </a>
                </div>
    `;

        console.log(e, "suc");
        outputBookmark(bookmarkItem);
      }, // В случае ошибки
      e => {
        const bookmarkItem = `
                <div class="bookmarks__bookmark-content">
                  <a
                    href="${bookmarkLink}"
                    target="_blank"
                    class="bookmarks__bookmark-link"
                  >
                   <span class='bookmarks__bookmark-letter'>${bookmarkName[0]}</span>
                    <span class="bookmarks__bookmark-name">${bookmarkName}</span>
                  </a>
                </div>
          `;
        console.log(e, "fail");
        outputBookmark(bookmarkItem);
      }
    );
  }
});

627cfed53f5dd221332391.png
Также если есть другой более эффективный вариант решения, буду рад услышать.
Спасибо!
  • Вопрос задан
  • 306 просмотров
Подписаться 1 Средний 3 комментария
Решения вопроса 1
zkrvndm
@zkrvndm
Архитектор решений
Выполняйте проверку на существование файла не прямым fetch-запросом, а косвенно, например через вставку соответствующего тега img и последующей проверкой, подгрузилась картинка или нет. Возможно поможет, а возможно и нет, сам не проверял. Просто идея на заметку.

Еще можно попробовать проверку через фрейм выполнять, а потом уничтожать фрейм, возможно тоже поможет, хз.

Лично я сам такую проблему решил бы так: тупо пропустил бы запрос через свой внутренний прокси на бэкенде, а он бы уже отдал ответ в закодированном и удобном мне виде, не показывая явным образом никаких ошибок.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Lynn
@Lynn
nginx, js, css
Никак.

Можете просто выключить у себя в настройках дев-тулзов
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы