You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Axios无法获取已设置的响应头?Network可见但res.headers为空

问题:Axios接收的res.headers为空,但Network标签可见响应头

服务器端部署的Server.cjs代码如下:

var express = require('express');
var cors = require('cors');
var app = express()
app.use(express.urlencoded({ extended: true }))
const port = 3001;
app.use(cors())

app.get("/download", (req, res) =>{
    const file_uniquename = req.query.file_uniquename
    const { file_originalname, mimetype, filepath } = ...

    res.setHeader('Content-disposition', 'attachment; filename=' +  file_originalname)
    res.setHeader('Contect-type', mimetype) // 注意拼写错误:应为Content-type
    const stream = fs.createReadStream(filepath)
    stream.pipe(res)
  }
})


app.listen(port, () => {console.log(`App listening at :${port}`);});

前端使用Axios请求文件时,开发者工具Network标签能看到设置的响应头,但Axios返回的res对象中headers为空。前端代码:

//import fileDownload from 'js-file-download'

axios.get(serverurl + 'download', { params: { file_uniquename: file_uniquename }})
    .then(res => {
        //fileDownload(res.data)
        //console.log(res.headers['Content-disposition'])
        console.log(res.headers)
    });

原因与解决方法

1. CORS跨域限制导致非简单响应头无法读取

浏览器的CORS机制规定:只有Cache-Control、Content-Type这类简单响应头能默认被前端JavaScript读取。Content-Disposition属于非简单头,必须在服务器端通过Access-Control-Expose-Headers明确暴露,否则Axios无法获取。

解决步骤:

在服务器端配置暴露指定响应头:

// 方式1:全局CORS配置时指定
app.use(cors({
  exposedHeaders: ['Content-Disposition', 'Content-Type']
}));

// 方式2:在/download接口单独设置
app.get("/download", (req, res) =>{
    // ... 原有逻辑
    res.setHeader('Access-Control-Expose-Headers', 'Content-Disposition, Content-Type');
    // ... 原有逻辑
})

2. Axios未配置正确的响应类型

默认情况下Axios会尝试将响应解析为JSON,而文件流是二进制数据,这会导致响应处理异常,间接影响头信息读取。需指定responseType为blob或arraybuffer。

解决步骤:

修改前端请求配置:

axios.get(serverurl + 'download', { 
  params: { file_uniquename: file_uniquename },
  responseType: 'blob'
})
.then(res => {
    // Axios会将响应头名转为小写
    console.log(res.headers['content-disposition']);
    // 解析文件名示例
    const disposition = res.headers['content-disposition'];
    const filename = disposition.split('filename=')[1];
    // 实现文件下载示例
    const url = window.URL.createObjectURL(res.data);
    const a = document.createElement('a');
    a.href = url;
    a.download = filename;
    a.click();
    window.URL.revokeObjectURL(url);
});

3. 服务器端响应头拼写错误

服务器代码中res.setHeader('Contect-type', mimetype)存在拼写错误,应改为Content-Type,否则头信息无法被正常识别。


内容的提问来源于stack exchange,提问作者Shine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:35:23