
0
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} 次`);
}
版权声明
本文系作者 @黄粱一梦 转载请注明出处,文中若有转载的以及参考文章地址也需注明。\(^o^)/~
Preview