Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / HTML, JavaScript, VBScript, CSS Новый топик    Ответить
 Axios вернуть сообщение об ошибке при загрузке файла  [new]
vb_sub
Member

Откуда:
Сообщений: 782
Привет, есть код который скачивает файл через axios.
  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;
    }
  }

Бэкэнд на шарпе
        /// <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- нет ничего.
28 окт 20, 11:51    [22222064]     Ответить | Цитировать Сообщить модератору
 Re: Axios вернуть сообщение об ошибке при загрузке файла  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1351
Намешал херни, я с пятого раза понял.

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

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

А у тебя судя по всему еще и какая обертка над axios, внутри которой может быть своя логика.
28 окт 20, 12:08    [22222088]     Ответить | Цитировать Сообщить модератору
 Re: Axios вернуть сообщение об ошибке при загрузке файла  [new]
vb_sub
Member

Откуда:
Сообщений: 782
Агнец за бортом,
await действительно лишний -как то по автомату впихнул его и теперь везде таскаю бездумно.
apiClient- это не обертка, это прокси для axios, чтобы можно было использовать $axios в js-файлах- то есть apiClient=$axios- там никакого перехватывающего функционала нет.
Делал вот по этому туториалу
Axios исключение создает, исполнение кода попадает в секцию catch и если я хочу прочитать, что там в BadRequest пришло
 
} catch (error) {
  console.log(error);
  errorMessage = error;
}

я просто получаю исключение, но не получаю объект, из которого можно было бы считать, что там пришло в BadRequest

К сообщению приложен файл. Размер - 5Kb
28 окт 20, 12:25    [22222104]     Ответить | Цитировать Сообщить модератору
 Re: Axios вернуть сообщение об ошибке при загрузке файла  [new]
voraa
Member

Откуда:
Сообщений: 166
vb_sub,

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

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;
    }
  }


Но это перехватит именно сетевую ошибку.
Раз отвечает сервер, то это не ошибка
Надо самому придумывать и разбирать ответы сервера, которыми он сообщает об ошибке в логике.
Может быть в ситуации, когда сервер считает что то ошибкой он тоже должен послать какой то БЛОБ с сообщением об ошибке.
А на клиенте уже читать и разбирать его.
28 окт 20, 14:54    [22222304]     Ответить | Цитировать Сообщить модератору
 Re: Axios вернуть сообщение об ошибке при загрузке файла  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1351
voraa,

 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;
  }
  }
31 окт 20, 18:03    [22224050]     Ответить | Цитировать Сообщить модератору
 Re: Axios вернуть сообщение об ошибке при загрузке файла  [new]
voraa
Member

Откуда:
Сообщений: 166
Агнец за бортом,

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

Да и проблемы это не решает.
31 окт 20, 19:48    [22224087]     Ответить | Цитировать Сообщить модератору
 Re: Axios вернуть сообщение об ошибке при загрузке файла  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1351
voraa,

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

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


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

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


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


В самом деле? Catch не срабатывает, или содержимого ошибки нет?
1 ноя 20, 14:17    [22224322]     Ответить | Цитировать Сообщить модератору
 Re: Axios вернуть сообщение об ошибке при загрузке файла  [new]
vb_sub
Member

Откуда:
Сообщений: 782
Скорее всего наиболее адекватный вариант это послать сначала послать запрос, который вернет json с информацией об ошибках, если такие есть или в противном случае вернуть файл.
2 ноя 20, 13:25    [22224797]     Ответить | Цитировать Сообщить модератору
Все форумы / HTML, JavaScript, VBScript, CSS Ответить