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!';
}
}
实际使用代理片段
注意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.js配置代理
文章作者:罗罗
文章链接:[复制]
最后修改时间:2025年 06月 23日 16时58分
商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。 本文采用CC BY-NC-SA 4.0进行许可。
Copyright © 2023-2025
豫ICP备2022014268号-1
「每想拥抱你一次,天空飘落一片雪,至此雪花拥抱撒哈拉!」
本站已经艰难运行了620天