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

Vue组件fetch请求无法将响应状态存入errorMessage新手求助

问题原因

核心问题来自两个你忽略的fetch API特性:

  • fetch API 和常见的axios等请求库逻辑不同,仅网络层错误(比如断网、跨域被拦截)才会进入catch回调,HTTP 4xx/5xx类的业务错误会被判定为请求成功,不会触发catch,因此你无法在默认的catch中拿到500状态对应的响应信息
  • 你当前代码中第一个.then(res => console.log(res))的返回值是undefined,导致后续链式调用的所有逻辑都拿不到原始响应对象,同时你注释了res.json()的解析逻辑,也无法正常获取响应体内容

另外你注释掉content-type的操作是正确的,FormData类型的请求不需要手动设置该请求头,浏览器会自动生成带boundary的请求头,手动设置反而会导致后端解析失败。

修正后的代码

addSpeler(){
  const formData = new FormData();
  formData.append('name',this.name);
  formData.append('pass_code',this.pass_code);
  formData.append('game_id', this.currentGame.id);
  if(this.exists === false){
    fetch(`api/speler`, {
      method: 'post',
      body:formData,
      headers:{
        // 'accept':'application/json'
      }
    })
    .then(res => {
      console.log(res)
      // 手动判断HTTP状态是否在正常区间(200~299)
      if (!res.ok) {
        // 手动抛出包含状态信息的错误,才会进入后续catch处理
        throw {
          status: res.status,
          statusText: res.statusText
        }
      }
      return res.json()
    })
    .then(data => {
      this.name='';
      this.code='';
    })
    .catch(err => {
      // 区分业务错误和网络错误
      if (err.status) {
        this.errorMessage = `请求失败:${err.status} ${err.statusText}`
      } else {
        this.errorMessage = `网络错误:${err.message}`
      }
      console.log(err);
    });
  }
},

内容的提问来源于stack exchange,提问作者M.Koops

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:48:03