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

React+Express项目使用Axios调用第三方API报304错误如何解决

核心错误:Axios请求头格式错误

你在user.controller.js中给第三方API发请求时,headers参数传的是字符串,而非Axios要求的对象格式,这是请求失败的直接原因:

// 错误写法:直接传入Authorization字符串值
return axios.get(api_url + "/api/users/me", {
  headers: req.headers["authorization"]
})

正确写法应该把Authorization头放到对象里:

// 正确写法
return axios.get(api_url + "/api/users/me", {
  headers: {
    Authorization: req.headers["authorization"]
  }
})

关于304状态码的说明

你看到的304不是第三方API返回的,是浏览器和你的Express后端之间的缓存协商状态:因为你两次请求失败后返回的内容都是固定的"error",内容完全一致,浏览器触发了协商缓存直接返回了本地缓存结果,和第三方API的请求无关,不用在这个点上浪费排查时间。


优化调整建议

1. 更稳妥的请求头获取方式

HTTP头本身是大小写不敏感的,Express提供的req.get()方法会自动匹配大小写,比直接读取req.headers更规范,避免因为大小写不一致导致的取值失败:

const token = req.get('Authorization');
if (!token) {
  return res.status(401).send({message: '缺少身份凭证'});
}

2. 补全CORS配置

你在app.js中自定义的Access-Control-Allow-Headers没有包含Authorization,部分浏览器可能会拦截跨域请求的Authorization头,建议补上:

app.use(function(req, res, next) {
  res.header(
    "Access-Control-Allow-Headers",
    "Authorization, x-access-token, Origin, Content-Type, Accept"
  );
  next();
});

3. 完善错误日志排查问题

你现在的catch块只打印请求失败,没有输出具体错误原因,建议补充错误日志,方便定位第三方API的返回信息:

.catch((err) => {
  console.log("请求第三方API失败:", err.response?.data || err.message);
  res.status(500).send("error");
});

4. 避免开发环境缓存干扰

调试阶段可以给接口添加禁用缓存的响应头,避免304缓存影响调试:

// 在roles接口处理逻辑中添加
res.set('Cache-Control', 'no-store');

5. 校验前端token存储逻辑

确认你登录成功后存入localStorage的user是纯token字符串,如果你存的是包含token属性的用户信息对象,需要调整auth-header.js的取值逻辑:

// 如果你存的是{token: "xxx", username: "xxx"}格式的对象,修改为
return {
  "Authorization": "Bearer " + user.token 
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 15:48:02