You need to enable JavaScript to run this app. 如何取消Nuxt fetch hook路由跳转请求并解决控制台报错问题
优惠活动
大模型
产品
解决方案
定价
更多

如何取消Nuxt fetch hook路由跳转请求并解决控制台报错问题

解决方案

核心原因

你遇到的问题本质是axios主动取消请求时会抛出一个特定的取消类型错误,这个错误没有被提前过滤,一路透传到Nuxt内置的fetch hook包装逻辑中,就会触发控制台报错和$fetchState.error赋值。

具体修改方案

方案1:全局axios拦截过滤取消错误(推荐)

直接在axios插件层统一处理所有取消请求的错误,无需修改现有业务代码,修改axios.js插件如下:

export default function ({ $axios, redirect, store }) {
  $axios.onRequest((config) => {
    const source = $axios.CancelToken.source()
    config.cancelToken = source.token
    store.commit('cancel/ADD_CANCEL_TOKEN', source)
    return config
  }, function (error) {
    return Promise.reject(error)
  })

  // 新增错误拦截,过滤主动取消的请求错误
  $axios.onError(error => {
    if ($axios.isCancel(error)) {
      // 主动取消的请求直接返回成功状态,不抛出错误
      return Promise.resolve({ canceled: true })
    }
    // 其他业务错误正常抛出
    return Promise.reject(error)
  })
}

方案2:业务层单独捕获过滤

如果不想全局处理所有取消请求,也可以在对应的vuex action或者fetch hook里单独过滤取消错误:

  • 修改vuex action示例:
export const actions = {
  async getRunsOverview ({ commit }) {
    try {
      const data = await this.$axios.$get('api/frontend/runs')
      commit('SET_RUNS', data)
    } catch (err) {
      // 仅非取消类型的错误才向外抛出
      if (!this.$axios.isCancel(err)) {
        throw err
      }
    }
  }
}
  • 或者直接在fetch hook中捕获:
async fetch () {
  try {
    await this.$store.dispatch('runs/getRunsOverview')
  } catch (err) {
    if (!this.$axios.isCancel(err)) {
      throw err
    }
  }
}

额外优化建议

如果不需要所有路由切换都全量取消请求,也可以结合组件生命周期,在组件销毁(beforeDestroy/beforeUnmount)时只取消当前组件发起的请求,实现更精细的控制,你当前的全局取消逻辑如果符合业务需求可以正常保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 22:45:03