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

Json 在使用VueJs的Axios中,当responseType为blob时,如何读取http错误?,json,laravel,vue.js,axios,blob,Json,Laravel,Vue.js,Axios,Blob,我在VueJS应用程序中使用带有Axios的blob responseType从服务器下载文档。当响应代码为200时,它可以正常工作并下载文件,但当出现任何http错误时,我无法在捕获错误时读取状态代码,因为错误是JSON响应 是否有人遇到过类似的问题,并找到了将blob响应类型转换为json并根据状态代码抛出错误的方法 我曾尝试从Laravel后端以纯文本形式发送响应,并尝试在前端将响应转换为JSON或文本,但没有成功 Axios({ url: 'xxxx',

我在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); }); 我尝试读取错误响应标题,但没有成功

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); }); Axios({ url:'xxxx', 方法:“GET”, responseType:'blob', }) 。然后((响应)=>{ //用于读取响应并使用blob创建对象url并下载文档的代码 }) .catch((错误)=>{ console.log('Error',Error.message);//无 console.log('Error',Error.Error);//未定义 console.log('Error',Error.data);//未定义 constblb=newblob([error],{type:“text/plain”}); const reader=new FileReader(); //这将在读取/加载blob后激发。 reader.addEventListener('loadend',(e)=>{ const text=e.srcielement.result; console.log(文本); }); //开始以文本形式读取blob。 reader.readAsText(blb); });
我只想根据状态码抛出错误消息。如果是401,只希望它未经授权,其他任何事情都会将其扔到组件上。

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

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

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


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

Axios({
url:'xxxx',
方法:“GET”,
responseType:'blob',
})
。然后((响应)=>{
//用于读取响应并使用blob创建对象url并下载文档的代码
})
.catch((错误)=>{
如果(
error.request.responseType==='blob'&&
Blob的error.response.data实例&&
error.response.data.type&&
error.response.data.type.toLowerCase().indexOf('json')!=-1
) {
新承诺((解决、拒绝)=>{
let reader=new FileReader();
reader.onload=()=>{
error.response.data=JSON.parse(reader.result);
解决(承诺、拒绝(错误));
};
reader.onerror=()=>{
拒绝(错误);
};
reader.readAsText(error.response.data);
})
。然后(err=>{
//你的回答来了
console.log(err.response.data)
})
};
});

有关更多信息,原因是响应类型为。
如果出现错误,状态代码将直接在exception对象中可用。然而,回应是一种承诺

您需要做的是:

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

有关更多详细信息,您可以。

可能重复@tony19,您提到的问题中没有关于blob的任何内容。@Tarasovych
responseType
字段与状态代码没有关系,状态代码的访问方式与此相同。您可能会发现这很有帮助:。这是一个类似的问题,有几种解决方案。
.catch((error) => {
    let statusCode = error.response.status
    let responseObj = await error.response.data.text();
       :
       :