当前位置: 首页 > 知识库问答 >
问题:

在使用VueJs的Axios中,当responseType为blob时,如何读取http错误?

邓浩漫
2023-03-14

我在VueJS应用程序中使用带有Axios的blob responseType从服务器下载文档。当响应代码为200时,它可以正常工作并下载文件,但当出现任何http错误时,我无法在捕获错误时读取状态代码,因为错误是JSON响应。

是否有人遇到过类似的问题,并找到了将blob响应类型转换为json并根据状态代码抛出错误的方法

我曾尝试从Laravel后端以纯文本形式发送响应,并尝试在前端将响应转换为JSON或文本,但没有成功。

我尝试读取错误响应标题,但没有成功。

Axios({
        url: 'xxxx',
        method: 'GET',
        responseType: 'blob', 
        })
    .then((response) => {
        //code to read the response and create object url with the blob and download the document
    })
    .catch((error) => {
      console.log('Error', error.message); //nothing
      console.log('Error', error.error); //undefined
      console.log('Error', error.data); //undefined

      const blb    = new Blob([error], {type: "text/plain"});
      const reader = new FileReader();

      // This fires after the blob has been read/loaded.
      reader.addEventListener('loadend', (e) => {
        const text = e.srcElement.result;
        console.log(text);
      });
     // Start reading the blob as text.
     reader.readAsText(blb);
});

我只想根据状态码抛出错误消息。如果它是401,只希望它是未经授权的,其他任何东西都会将它扔到组件上。

共有3个答案

萧秋月
2023-03-14

我相信您可能在catch()中错误地使用了error变量。

Axios传递一个错误对象,该对象具有响应属性,您可以在该属性中查找错误消息

https://github.com/axios/axios#handling-错误

在旁注中,如果您能够捕获错误服务器端,您可以尝试将内容类型标题设置为文本/普通。使用标题('Content-Type:plain/text')或Laravel的响应方法

洪德寿
2023-03-14

您需要将响应blob转换为json:

Axios({
    url: 'xxxx',
    method: 'GET',
    responseType: 'blob',
  })
  .then((response) => {
    //code to read the response and create object url with the blob and download the document
  })
  .catch((error) => {
    if (
      error.request.responseType === 'blob' &&
      error.response.data instanceof Blob &&
      error.response.data.type &&
      error.response.data.type.toLowerCase().indexOf('json') != -1
    ) {
      new Promise((resolve, reject) => {
          let reader = new FileReader();
          reader.onload = () => {
            error.response.data = JSON.parse(reader.result);
            resolve(Promise.reject(error));
          };

          reader.onerror = () => {
            reject(error);
          };

          reader.readAsText(error.response.data);
        })
        .then(err => {
          // here your response comes
          console.log(err.response.data)
        })
    };
  });

更多信息

澹台华采
2023-03-14

原因是响应类型为blob
如果出现错误,状态代码直接在异常对象中可用。然而,回应是一种promise。

你需要做的是:

.catch((error) => {
    let statusCode = error.response.status
    let responseObj = await error.response.data.text();
       :
       :

有关更多详细信息,您可以阅读留档。

 类似资料:
  • 我的问题与此类似,没有答案。我试着搜索其他很多地方,但仍然没有答案。 我从上面的代码中删除了,然后再试一次,我现在得到了错误消息,但是下载的文件没有任何内容,它是一个空白数据。 如何下载文件并处理服务返回的错误响应?

  • 问题内容: 我使用加载一些二进制数据 如果发生错误,服务器将以错误的JSON对象响应,例如 有什么方法可以得到与成功响应不同类型的错误响应? 问题答案: 编辑:正如@Paul LeBeau指出的那样,我的答案假设响应是ASCII编码的。 基本上,您只需要将ArrayBuffer解码为字符串并使用JSON.parse()。 我在IE11和Chrome中进行了测试,效果很好。

  • 我有一个Axios请求下载。xls文件。问题是,作为后端响应返回的对象并不总是必须是真实的文件。如果我返回json对象而不是文件数据。那么我将如何阅读这个json呢? 以下是函数: 我想阅读响应,如果其中包含一些数据-不要创建blob并启动下载,而是显示一些消息或其他内容。如果我删除responseType:'blob',则。xls文件下载为不可读且无效的文件。 因此,问题是每个返回的响应都变成B

  • 这可能看起来很愚蠢,但是我试图在Axios中请求失败时获取错误数据。 是否可以获取一个可能包含状态代码和内容的对象,而不是字符串?例如:

  • 我是数据库管理员的新手。我编写示例代码来读取Azure数据库管理员中的存储Blob。 它抛出错误: 我猜它在WASBS链接中没有附加SAS令牌,所以它没有读取数据的权限。 如何在wasbs链接中连接SAS。

  • 我正在使用以下代码向Laravel发布一些内容: (不相关代码省略) 当Laravel返回200时,这总体上是有效的。如果我从Laravel Axios返回401、422或其他东西,会在控制台中抛出一个错误,整个方法将停止运行。 我一直认为这是一种非常不利于开发人员的行为——我不明白吗?从后端API返回不同的状态代码应该有助于读取Vue中的响应,但Vue/Axios将每个非200响应视为致命错误。