接口设置了responseType:‘blob‘后,接收不到后端错误信息

下载文件流,需要接口设置responseType:'blob',接口设置了responseType:'blob'后,拿不到后端接口的异常信息,我们只需要添加如下代码:

const service = axios.create({
  baseURL: ***, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 30000 // request timeout
})
// 请求拦截器
service.interceptors.response.use(
 
  response => {
    // 省略。。。
  },
  error => {
    // console.log('err' ,JSON.parse(JSON.stringify(error))) // for debug
     // 关键!!! 拿到blob信息
    if(error.response&&error.response.data instanceof Blob&&error.response.data.type==='application/json'){
      error.response.data.text().then(text=>{
        const json=JSON.parse(text)
        Message({
          message: json.message,
          type: 'warning',
          duration: 5 * 1000
        })
        
      })
      return  Promise.reject(json.message)
    }
   // 普通异常
    Message({
      message: JSON.parse(JSON.stringify(error.response)).data.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(JSON.parse(JSON.stringify(error.response)).data.message)
  }
)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果你想在前端接收后端返回的文件名,可以在后端设置一个响应头来指定文件名,然后在前端通过获取响应头来获取文件名。具体操作如下: 后端代码示例(Node.js): ``` const fs = require('fs'); const path = require('path'); const express = require('express'); const app = express(); app.get('/download', function(req, res) { const filePath = path.join(__dirname, 'example.txt'); const fileName = 'example.txt'; const stat = fs.statSync(filePath); res.setHeader('Content-Disposition', 'attachment; filename=' + fileName); res.setHeader('Content-Type', 'application/octet-stream'); res.setHeader('Content-Length', stat.size); const stream = fs.createReadStream(filePath); stream.pipe(res); }); app.listen(3000, function() { console.log('Server is running on port 3000'); }); ``` 在上面的代码中,我们设置了 `Content-Disposition` 响应头来指定文件名为 example.txt。 前端代码示例(Vue.js): ``` downloadFile() { axios({ url: 'http://localhost:3000/download', method: 'GET', responseType: 'blob', }).then((response) => { const contentDisposition = response.headers['content-disposition']; const fileName = contentDisposition.split(';')[1].split('=')[1].replace(/"/g, ''); const blob = new Blob([response.data]); const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = fileName; link.click(); }); }, ``` 在上面的代码中,我们通过 `responseType: 'blob'` 来告诉 axios,我们需要接收一个二进制流。然后,我们通过获取响应头中的 `Content-Disposition` 字段来获取文件名,并使用 `new Blob()` 方法创建一个 Blob 对象,再通过创建一个 `<a>` 标签来触发下载操作,并设置 `download` 属性为文件名。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值