Nest.js配置代理

黄粱一梦2025-02-160

Nest.js配置代理ip

nest.js配置代理ip进行请求第三方API

简单使用示例

import { Injectable } from '@nestjs/common';
import axios from 'axios';
import * as tunnel from 'tunnel'
// console.log(tunnel);


@Injectable()
export class AppService {
  private readonly proxyUrl = "60.186.240.192"
  private readonly port = 40035
  // private readonly targetUrl = "http://sms.ssl憑證.com/api/smsforjson5?Room=POhGQiLeHM"
  private readonly targetUrl = "http://icanhazip.com"
  
  constructor(){
    
  }

  private async loadProxy (){
    const tunnelProxy = tunnel.httpsOverHttp({
      proxy: {
        host: this.proxyUrl,
        port: this.port,
      }
    })
    await axios({
      proxy:false,
      url:this.targetUrl,
      // httpAgent: tunnelProxy
    }).then(res => {
      console.log('res',res);
      
    }).catch(err => {
      console.log('err',err);
      
    })
  }
  
  getHello(): string {
    this.loadProxy()
    return 'Hello World!';
  }
}


项目中使用

实际使用代理片段

:::warning
注意axios配置中的httpAgent和httpsAgent
:::

  private async proxyRequest(url: string, config: any, retries = 1) {
    let attempt = 0;

    while (attempt < retries) {
      const proxy = this.proxyPool.getNextProxy();
      if (!proxy) throw new Error('无可用代理');

      try {
        const tunnelAgent = tunnel.httpsOverHttp({
          proxy: {
            host: proxy.ip,
            port: proxy.port,
            proxyAuth: `${proxy.username}:${proxy.password}`,
            headers: {
              // 'Proxy-Authorization': 'Basic ' + Buffer.from(`${proxy.username}:${proxy.password}`).toString('base64'),
              'User-Agent': userAgents[Math.floor(Math.random() * userAgents.length)]
            }
          }
        });
        // const agent = new HttpsProxyAgent(`http://${proxy.username}:${proxy.password}@${proxy.ip}:${proxy.port}`);
        
        console.log(`正在使用代理 [http://${proxy.username}:${proxy.password}@${proxy.ip}:${proxy.port}]`);
        
        const response = await axios({
          url,
          // headers:config.headers,
          proxy:false,
          headers:{
            "User-Agent" :userAgents[Math.floor(Math.random() * userAgents.length)]
          },
          httpAgent:tunnelAgent,
          httpsAgent:tunnelAgent
        })
        // console.log('response',response);
        this.logger.log(`${proxy.ip}:${proxy.port} 响应码:${response.status} ,内容:${JSON.stringify((response.data))}`);
        return response.data;
      } catch (error) {
        // console.log('代理请求错误error',error);
        this.logger.warn(`代理请求失败 [${proxy.ip}:${proxy.port}] 尝试 ${attempt + 1}/${retries}`);
        this.proxyPool.markFailure(proxy);
        attempt++;
        await new Promise(resolve => setTimeout(resolve, 2000 * attempt)); // 退避延迟
      }
    }
    
    throw new Error(`请求失败,已尝试 ${retries} 次`);
  }

分类:Nest

标签:后端axiosNest

上一篇一行命令windows关闭自动更新 - win11亲测下一篇el-plus表头筛选表格显示字段

版权声明

本文系作者 @黄粱一梦 转载请注明出处,文中若有转载的以及参考文章地址也需注明。\(^o^)/~

Preview