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

React中Axios拦截器报request is not a function错误解决方案

Axios调用interceptors.request报错排查与修复

触发报错

运行代码时抛出如下类型错误:

TypeError: constants_api_constants__WEBPACK_IMPORTED_MODULE_1.default.interceptors.request is not a function

核心问题排查

  • 语法错误:const options.GET_ALL_STUDENTS = {}属于非法声明,const关键字后必须跟合法变量名,不能直接写属性访问表达式,该问题会导致模块编译、导入异常,和webpack报错信息对应。
  • 用法错误:对Axios拦截器的API理解完全偏差。api.interceptors.request不是发起请求的方法,它仅提供use接口用于注册请求前置钩子,不支持传入请求配置直接调用,你写的api.interceptors.request(options.GET_ALL_STUDENTS)属于非法调用,必然抛出类型错误。
  • 逻辑错误:拦截器是实例级的全局钩子,只需要在Axios实例初始化完成后注册一次即可,写在单次请求函数里会导致每次调用请求都重复注册拦截器,引发内存泄漏、逻辑重复执行问题。
  • 导入校验:如果修正上述问题后仍报错,检查对应常量文件的导出逻辑,确认你导入的api变量是axios.create()生成的实例,而非普通JS配置对象。

可直接运行的修复代码

  1. 修正常量声明、Axios实例初始化与拦截器注册逻辑,拦截器只注册一次:
// 修正非法的常量声明
const REQUEST_OPTIONS = {
  GET_ALL_STUDENTS: {
    method: "GET",
    url: "/Student",
  }
}
const BASE_API_URL = "https://localhost:7072/api";
const api = axios.create({
  baseURL: BASE_API_URL,
});

// 拦截器在实例创建后全局注册一次即可,不要放在请求函数内
api.interceptors.request.use(
  function (config) {
    // 可在此处添加统一逻辑:如注入token、修改请求头、添加签名等
    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

// 响应拦截器按需注册
api.interceptors.response.use(
  function (response) {
    // 可在此处统一处理响应格式、错误码
    return response;
  },
  function (error) {
    return Promise.reject(error);
  }
)
  1. 修正请求函数逻辑,用Axios实例发起请求而非调用拦截器:
const getStudents = () => {
  // 直接调用实例传入配置即可发起请求
  return api(REQUEST_OPTIONS.GET_ALL_STUDENTS);
};
  1. 原有redux-saga的请求处理逻辑无需修改,保持原有写法即可正常运行:
function* fetchStudents() {
  try {
    const result1 = yield call(getStudents);
    const studentList = createStudentListAdapter(result1.data);
    yield put(fetchStudentsSuccess(studentList));
  } catch (error) {
    yield put(fetchStudentsFailure());
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:09:25