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

ReactJS中Axios请求拦截器启用时响应拦截器不生效问题求解

Axios请求拦截器启用时响应拦截器不触发问题

问题描述

有一个ReactJS项目,使用Axios拦截器为需要认证的请求添加JWT token,同时在同一个自定义Axios实例上定义了响应拦截器。只要请求拦截器处于启用状态,响应拦截器就不会在请求结束后触发;注释掉请求拦截器后,响应拦截器就能正常运行,看起来是请求拦截器阻断了Axios后续的拦截流程。

相关代码

自定义Axios拦截器文件(导出带拦截逻辑的实例)

import axios from 'axios'
import { utils } from './index'

let user = null
let token = null

const customAxios = axios.create({})

// Request interceptor
customAxios.interceptors.request.use(
  (req) => handleRequest(req),
  (e) => {
    console.log('Error from request interceptor: ', e.response)
    return handleError(e)
  }
)

// Response interceptor
customAxios.interceptors.response.use(
  (res) => handleResponse(res),
  (e) => {
    console.log('Error intercepted from response: ', e.response)
    return handleError(e)
  }
)

const handleRequest = (request) => {
  addTokenIfExists(request)
  // TODO: future custom request modifiers
  return request
}

const handleResponse = (response) => {
  console.log('Intercepted response:', res)
  // TODO: future custom response modifiers
  return response
}

const handleError = (e) => {
  // TODO: when this works for response add to Redux error variable to display in app
  if (e.response.status === 401) {
    console.log('Code was 401: Authorization error from response')
  }
  return Promise.reject(e)
}

const addTokenIfExists = (req) => {
  user = JSON.parse(window.localStorage.getItem('loggedUser'))
  token = `Bearer ${user ? user.token : null}`

  // Check if token is expired with every request, if it is, remove it from localStorage
  token = utils.checkIfTokenExpired(user, token)

  // Add token to each request if it's found
  if (token) {
    req.headers = {
      ...req.headers,
      Authorization: token,
    }
  }

  console.log('Intercepted request:', req)

  return req
}

export default customAxios

自定义Axios实例使用示例(用户服务文件)

import axios from '../services/interceptors'

const baseUrl = '/users'

const getUser = async (id) => {
  let res = null

  await axios
    .get(baseUrl + '/' + id)
    .then((req) => {
      res = req.data
    })
    .catch((e) => {
      return Promise.reject(e)
    })

  return res
}

const userService = {
  getUser,
}

export default userService

问题诉求

计划用响应拦截器统一处理错误,为前端生成自定义错误对象,但目前无法触发handleResponse()函数的控制台打印,除非移除请求拦截器,需要定位响应拦截器无法触发的原因。

最终排查结果

该问题是旧版本Axios(0.21.2)存在的已知bug,将Axios升级到0.25.0及以上版本即可解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:03:00