powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Axios вернуть сообщение об ошибке при загрузке файла
8 сообщений из 8, страница 1 из 1
Axios вернуть сообщение об ошибке при загрузке файла
    #40012548
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, есть код который скачивает файл через axios.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  async postFileDownload(url, payload) {
    let errorMessage;
    try {
      await apiClient.post(url, payload, { responseType: "blob" }).then(r => {
        const url = window.URL.createObjectURL(new Blob([r.data]));
        const link = document.createElement("a");
        link.href = url;
        const contentDisposition = r.headers["filename"];

        let fileName = "unknown";
        if (contentDisposition) {
          fileName = contentDisposition;
        }
        link.setAttribute("download", fileName);
        document.body.appendChild(link);
        link.click();
      });
    } catch (error) {
      console.log(error);
      errorMessage = error;
    }
  }


Бэкэнд на шарпе
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
        /// <summary>
        /// Скачать xml-файл 
        /// </summary>
        /// <param name="getXmlForCommit"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> GetXmlForCommitAsync([FromBody]GetXmlForCommitParam getXmlForCommit)
        {
            try
            {
                if (scans.Count()< getXmlForCommit.documentCount)
                {
                    return BadRequest("Error happen");
                }

                var xDoc = new XDocument(
                new XDeclaration("1.0", "UTF-8", null));

                using (var fromXml = new MemoryStream())
                {
                    xDoc.Save(fromXml);
                    Response.Headers.Add("fileName", "Commit.xml");
                    Response.Headers.Add("Access-Control-Expose-Headers", "fileName");
                    return File(fromXml.ToArray(), "application/octet-stream", "Commit.xml");
                }
            }
            catch (Exception ex)
            {
                return BadRequest(ex.message);
            }           
        }


Вопрос в том, как перехватить текст внутри BadRequest("Error happen")? Проблема в том, что запрос ожидает Blob-контент и не ожидает какого-либо другого типа. Пробовал проверять error.message- нет ничего.
...
Рейтинг: 0 / 0
Axios вернуть сообщение об ошибке при загрузке файла
    #40012558
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Намешал херни, я с пятого раза понял.

Зачем тебе и await и then в одном куске кода?

Вообще-то, если у тебя сервер возвращает http-статус ошибки, то axios должен создавать исключение.

А у тебя судя по всему еще и какая обертка над axios, внутри которой может быть своя логика.
...
Рейтинг: 0 / 0
Axios вернуть сообщение об ошибке при загрузке файла
    #40012564
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,
await действительно лишний -как то по автомату впихнул его и теперь везде таскаю бездумно.
apiClient- это не обертка, это прокси для axios, чтобы можно было использовать $axios в js-файлах- то есть apiClient=$axios- там никакого перехватывающего функционала нет.
Делал вот по этому туториалу
Axios исключение создает, исполнение кода попадает в секцию catch и если я хочу прочитать, что там в BadRequest пришло
Код: javascript
1.
2.
3.
4.
5.
 
} catch (error) {
  console.log(error);
  errorMessage = error;
}


я просто получаю исключение, но не получаю объект, из которого можно было бы считать, что там пришло в BadRequest
...
Рейтинг: 0 / 0
Axios вернуть сообщение об ошибке при загрузке файла
    #40012644
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub,

Можно и так попробовать

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
postFileDownload(url, payload) {
    let errorMessage;

   apiClient.post(url, payload, { responseType: "blob" })
   .then(r => {
        const url = window.URL.createObjectURL(new Blob([r.data]));
        const link = document.createElement("a");
        link.href = url;
        const contentDisposition = r.headers["filename"];

        let fileName = "unknown";
        if (contentDisposition) {
          fileName = contentDisposition;
        }
        link.setAttribute("download", fileName);
        document.body.appendChild(link);
        link.click();
      })
   .catch (error) {
      console.log(error);
      errorMessage = error;
    }
  }



Но это перехватит именно сетевую ошибку.
Раз отвечает сервер, то это не ошибка
Надо самому придумывать и разбирать ответы сервера, которыми он сообщает об ошибке в логике.
Может быть в ситуации, когда сервер считает что то ошибкой он тоже должен послать какой то БЛОБ с сообщением об ошибке.
А на клиенте уже читать и разбирать его.
...
Рейтинг: 0 / 0
Axios вернуть сообщение об ошибке при загрузке файла
    #40013759
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa,

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 async postFileDownload(url, payload) {
 let errorMessage;
  try {
    let result = await apiClient.post(url, payload, { responseType: "blob" });

    const url = window.URL.createObjectURL(new Blob([result.data]));
    const link = document.createElement("a");
    link.href = url;
    const contentDisposition = r.headers["filename"];

    let fileName = "unknown";
    if (contentDisposition) {
      fileName = contentDisposition;
    }
    link.setAttribute("download", fileName);
    document.body.appendChild(link);
    link.click();
  } catch (error) {
    console.log(error);
    errorMessage = error;
  }
  }
...
Рейтинг: 0 / 0
Axios вернуть сообщение об ошибке при загрузке файла
    #40013776
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Агнец за бортом,

А смысла писать async только для того, что бы один раз использовать await. И возиться с try, что бы ловить ошибки, вместо простого .catch
Тем более никому в голову не придет вызывать эту функцию await postFileDownload

Да и проблемы это не решает.
...
Рейтинг: 0 / 0
Axios вернуть сообщение об ошибке при загрузке файла
    #40013930
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa,

А сколько раз надо использовать await, чтобы появился смысл использовать async?

"Возиться с try" vs "простого catch" - это пять.


voraa
Тем более никому в голову не придет

Ну, пусть добавит в навзание Async


voraa
Да и проблемы это не решает.


В самом деле? Catch не срабатывает, или содержимого ошибки нет?
...
Рейтинг: 0 / 0
Axios вернуть сообщение об ошибке при загрузке файла
    #40014253
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего наиболее адекватный вариант это послать сначала послать запрос, который вернет json с информацией об ошибках, если такие есть или в противном случае вернуть файл.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Axios вернуть сообщение об ошибке при загрузке файла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]