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

使用Zustand时Axios请求出现未捕获Promise错误(状态码300)

解决React请求API返回300状态码的问题

首先明确:300是多重选择重定向状态码,Postman会自动处理或展示可选资源,但浏览器端的Axios/Fetch不会自动跟进这种重定向,导致报错。结合你的情况,按以下步骤排查:

1. 对齐Postman与前端请求头

打开Postman的请求详情,复制所有请求头,在前端Axios请求里完全照搬,排除因请求头不一致导致的服务器响应差异:

loadLivespa: async () => {
  try {
    const response = await axios.get(URL1, {
      headers: {
        // 粘贴Postman里的所有请求头,示例:
        "Accept": "*/*",
        "User-Agent": "PostmanRuntime/7.36.3"
      }
    });
    set({ liveSpa: response.data });
  } catch (err) {
    console.log(err.response); // 打印完整响应信息方便排查
  }
},

2. 检查服务器CORS配置

Postman不受浏览器CORS限制,但前端请求会被拦截。如果服务器未配置允许前端域名(http://localhost:3000)的跨域请求,可能触发异常重定向。以Node.js为例,确保CORS配置正确:

const cors = require('cors');
// 允许前端域名跨域
app.use(cors({ origin: 'http://localhost:3000' }));
// 开发环境可临时允许所有来源(生产环境禁用)
// app.use(cors());

3. 手动处理300重定向

Axios默认不自动处理300重定向,可捕获错误后手动提取正确资源地址再发起请求:

loadLivespa: async () => {
  try {
    const response = await axios.get(URL1);
    set({ liveSpa: response.data });
  } catch (err) {
    if (err.response?.status === 300) {
      // 从响应头或响应体中提取正确资源地址
      const targetUrl = err.response.headers.location || err.response.data?.locations[0];
      if (targetUrl) {
        const finalRes = await axios.get(targetUrl);
        set({ liveSpa: finalRes.data });
      }
    } else {
      console.error('请求失败:', err);
    }
  }
},

4. 排查服务器路由逻辑

调试服务器的/livespa路由,打印请求的origin、headers等信息,确认是否因为请求来源是浏览器,服务器返回了300重定向而非数据。比如服务器可能存在针对浏览器请求的跳转逻辑,需要去掉或调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:20:23