Axios 报错及解决方法

Axios 是一个基于 Promise 的 HTTP 客户端库,可用于在浏览器和 Node.js 中发送 HTTP 请求。它提供了一种简单和直观的方式来进行网络传输,支持拦截请求和响应,以及转换请求和响应数据。然而,使用 Axios 进行网络请求时,有时会遇到报错的情况。本文将介绍一些常见的 Axios 报错,并提供解决方法。

1. 报错场景及示例

1.1. 跨域请求被拒绝

Axios 默认不允许跨域请求,当发送跨域请求时,浏览器会拒绝该请求,并报错 Access to XMLHttpRequest at ' from origin 'http://localhost:3000' has been blocked by CORS policy

解决方法:使用代理服务器或设置服务器响应头。

1.1.1. 使用代理服务器

在本地开发环境中,可以通过配置代理服务器来绕过跨域限制。例如,使用 webpack-dev-server 可以配置代理服务器,将请求转发到目标服务器。

// webpack.config.js

module.exports = {
  // ...
  devServer: {
    proxy: {
      '/api': {
        target: '
        changeOrigin: true,
        pathRewrite: {
          '^/api': '',
        },
      },
    },
  },
};

使用上述配置后,发送请求时,将所有以 /api 开头的路径代理到 `

1.1.2. 设置服务器响应头

如果你有权限修改服务器代码,可以在服务器端设置响应头,允许跨域请求。

// server.js

const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

// ...

在上述代码中,设置 Access-Control-Allow-Origin*,表示允许任意源的请求;设置 Access-Control-Allow-Methods 为允许的请求方法;设置 Access-Control-Allow-Headers 为允许的请求头。

1.2. 请求超时

当网络请求花费的时间超过预设的超时时间时,Axios 会报错 Error: timeout of xxxms exceeded

解决方法:增加超时时间或检查网络连接。

1.2.1. 增加超时时间

可以通过设置 timeout 选项来增加超时时间。例如,将超时时间设置为 5000 毫秒:

axios.get(' { timeout: 5000 })
  .then(response => {
    // ...
  })
  .catch(error => {
    // ...
  });
1.2.2. 检查网络连接

如果请求超时问题经常发生,可能是网络连接不稳定引起的。可以通过检查网络连接质量、更换网络环境或与网络管理员联系来解决该问题。

1.3. 请求被取消

有时,我们需要在发送请求后取消该请求。当请求被取消时,Axios 会报错 Error: Request aborted

解决方法:使用 CancelToken 进行请求取消。

const source = axios.CancelToken.source();

axios.get(' { cancelToken: source.token })
  .then(response => {
    // ...
  })
  .catch(error => {
    if (axios.isCancel(error)) {
      console.log('Request canceled', error.message);
    } else {
      console.log('Error', error.message);
    }
  });

// 取消请求
source.cancel('Operation canceled by the user.');

在上述代码中,使用 axios.CancelToken.source() 创建 CancelToken 对象,并将其传递给请求的 cancelToken 选项。然后,使用 source.cancel() 方法来取消请求。

2. 常见问题解答

2.1. 如何拦截请求和响应?

Axios 提供了拦截器,可以在发送请求和响应之前或之后执行一些操作。使用 interceptors 属性可以添加请求拦截器和响应拦截器。