NodeJS

解决axios的HTTP代理问题

2024-3-10 2127字 2,307

在进行web开发时,我们经常会遇到需要使用HTTP代理的情况,例如在进行跨域请求或者爬虫开发时。axios是一个非常流行的HTTP请求库,它提供了丰富的接口和配置,使得我们可以方便地进行HTTP请求。然而,在实际使用中,我们可能会遇到axios的HTTP代理配置无法生效的问题。本文将详细介绍如何解决这个问题。

axios的HTTP代理问题

实际上 axios 是有代理配置选项的,但实际使用过后发现并不生效

import axios, { AxiosError } from 'axios'

async function test() {
    try {
        const response = await axios.get('http://xxxxx', {
            proxy: { 
                 host: '127.0.0.1',
                 port: 8101,
            },
            timeout: 30 * 1000,
        })
        console.log(response.data)
    } catch (error) {
        if (error?.isAxiosError) {
            console.error((error as AxiosError).toJSON())
            return
        }
        console.error(error)
    }
}

解决方案

幸运的是,我们可以通过使用第三方库https-proxy-agent或node-tunnel来解决这个问题。这些库可以帮助我们创建一个可以使用HTTP代理的axios实例。

首先,我们需要安装https-proxy-agent库。请确保你的axios版本为1.6.7或更高,https-proxy-agent版本为7.0.4或更高。

然后,我们可以创建一个axios实例,并在请求拦截器中设置代理:

const axios = require('axios').default
const httpsProxyAgent =require('https-proxy-agent')
const http = axios.create({
  baseURL: 'https://httpbin.org/',
  proxy: false,
})

// 由于很多接口都要走代理, 所以应该在拦截器里应用
http.interceptors.request.use(async (config) => {
  // 这里可以异步通过 api 去请求最新的代理服务器配置
  // 127.0.0.1:1080 是你的代理服务器的 ip 和端口, 由于我本地搭建了一个, 所以我使用我本地的测试
  config.httpsAgent = await new httpsProxyAgent.HttpsProxyAgent(`http://192.168.50.2:7890`)
  return config
}, (err) => Promise.reject(err))
http.interceptors.response.use((res) => res.data, (err) => Promise.reject(err))

new Promise(async () => {
  const data = await http.get(`/ip`).catch((err) => console.log(String(err)))
  // 如果这个地方返回了你的代理 ip 的地址, 则表示成功应用了代理
  console.log(`data`, data)
})

在这个例子中,我们在请求拦截器中设置了代理服务器的地址和端口。这样,所有通过这个axios实例发出的请求都将通过代理服务器进行。

参考

  1. axios Issue 参考链接
  2. Node 环境下 axios 的 proxy 配置 出坑攻略
  3. 解决 axios 的 http 代理问题
  4. spider-proxy
版权声明:Shire 发表于 2024-3-10
转载请注明: 解决axios的HTTP代理问题 | Shire

评论