我在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,只希望它是未经授权的,其他任何东西都会将它扔到组件上。
我相信您可能在catch()
中错误地使用了error
变量。
Axios传递一个错误对象,该对象具有响应
属性,您可以在该属性中查找错误
或消息
。
https://github.com/axios/axios#handling-错误
在旁注中,如果您能够捕获错误服务器端,您可以尝试将内容类型
标题设置为文本/普通
。使用标题('Content-Type:plain/text')
或Laravel的响应方法
您需要将响应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)
})
};
});
更多信息
原因是响应类型为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响应视为致命错误。