使用 undici 为 Node.js 原生 fetch 请求设置代理

ops/2024/10/30 15:15:06/

在 Node.js 项目中,有时需要通过代理服务器发送 HTTP 请求。然而,许多第三方库(如原生 fetch)无法直接支持 https-proxy-agentsocks-proxy-agent 等代理库。在这种情况下,可以通过 undici 提供的全局调度器为请求设置代理。

一、为什么使用 undici 处理代理

在 Node.js 中,原生 fetch 和部分第三方库无法直接使用 https-proxy-agentsocks-proxy-agent 进行代理。为了解决这一问题,可以借助 undici 库,通过其全局调度器(Global Dispatcher)功能实现代理设置。undici 是一个高效的 HTTP 客户端,提供了对代理服务器的全面支持。

二、通过 undici 设置全局代理

要在 Node.js 中为所有请求统一设置代理,可以利用 undici 的全局调度器。以下是一个简单的例子,演示如何使用 HTTP 和 SOCKS5 代理发送请求。

1. 安装 undici 依赖

在项目中使用 undici,首先需要安装该库:

npm install undici

2. 使用 HTTP 代理进行请求

以下代码展示了如何通过 undici 设置 HTTP 代理,并使用原生 fetch 进行请求。

const { setGlobalDispatcher, ProxyAgent } = require("undici");// 设置 HTTP 代理
const httpDispatcher = new ProxyAgent({ uri: "<http://127.0.0.1:7899>" });
setGlobalDispatcher(httpDispatcher);// 请求获取 IP 地址
const getIP = async () => {fetch("<https://httpbin.org/ip>", {headers: {"User-Agent": "Mozilla/5.0 (compatible; curl/7.64.1)",Accept: "*/*",},}).then((res) => res.json()).then((res) => {console.log("通过 HTTP 代理获取到的 IP:", res);}).catch((err) => console.log("请求失败:", err));
};getIP();

该示例中,通过 HTTP 代理访问 https://httpbin.org/ip 接口,并返回客户端的 IP 地址。

3. 使用 SOCKS5 代理进行请求

如果需要使用 SOCKS5 代理,只需将 uri 设置为 SOCKS5 代理地址:

const socks5Dispatcher = new ProxyAgent({ uri: "socks5://127.0.0.1:1080" });
setGlobalDispatcher(socks5Dispatcher);

通过该方式,所有请求将通过 SOCKS5 代理进行。

三、未使用代理的请求示例

为了对比代理前后的效果,以下代码展示了未使用代理时的请求:

const getIPWithoutProxy = async () => {fetch("<https://httpbin.org/ip>", {headers: {"User-Agent": "Mozilla/5.0 (compatible; curl/7.64.1)",Accept: "*/*",},}).then((res) => res.json()).then((res) => {console.log("未使用代理获取到的 IP:", res);}).catch((err) => console.log("请求失败:", err));
};getIPWithoutProxy();

此请求不会经过代理服务器,获取到的 IP 地址为客户端本机的外网 IP。

总结

通过 undici 库的全局调度器功能,可以轻松为 Node.js 中的原生 fetch 请求配置代理。无论是 HTTP 还是 SOCKS5 代理,均可通过 ProxyAgent 设置,并通过 setGlobalDispatcher 方法统一应用到所有请求。这种方法适合需要在项目中全局配置代理的场景,避免了为每个请求单独设置代理的麻烦,同时提高了代码的可维护性。


http://www.ppmy.cn/ops/129614.html

相关文章

从三方云服务器将数据迁移至本地,如何保障安全高效?

前言 在数字化时代&#xff0c;企业越来越多地依赖云服务来存储和管理数据。然而&#xff0c;随着业务的发展和需求的变化&#xff0c;企业有时需要将数据从第三方云服务器迁移到本地。这一过程不仅涉及大量的数据传输&#xff0c;还需要确保数据的安全性和迁移的高效性。本文…

云手机简述(概况,使用场景,自己部署云手机)

背景 最近经常会看到云手机的相关广告&#xff0c;手痒难耐&#xff0c;了解一下。 我的主要需求&#xff1a; Android 已 root&#xff0c;能够做一些自动化等高级功能。能够通过 远程adb 控制手机。能够尽量的少花钱&#xff0c;最好是能够提供动态创建删除手机的方式&…

【待学习 】 DHTMLX Gantt

DHTMLX Gantt是一个开源 JavaScript 甘特图库&#xff0c;可以帮助您以美观的图表形式说明和管理项目计划。 它可以将任务之间的依赖关系显示为线条&#xff0c;并允许您设置任务之间的不同关系&#xff08;完成-开始、开始-开始、完成-完成、开始-完成&#xff09;。标准版还…

2025考研各省市网上确认时间汇总!

2025考研各省市网上确认时间汇总&#xff01; 安徽&#xff1a;11月1日至5日 福建&#xff1a;11月1日-11月5日 山东&#xff1a;10月31日9:00至11月5日12:00 新疆&#xff1a;10月31日至11月4日17:00 湖南&#xff1a;11月1日9:00-4日12:00 广东&#xff1a;10月下旬至1…

搜索引擎算法更新对网站优化的影响与应对策略

内容概要 随着互联网的不断发展&#xff0c;搜索引擎算法也在不断地进行更新和优化。了解这些算法更新的背景与意义&#xff0c;对于网站管理者和优化人员而言&#xff0c;具有重要的指导意义。不仅因为算法更新可能影响到网站的排名&#xff0c;还因为这些变化也可能为网站带…

题目欣赏 之 初心数

不变初心数是指这样一种特别的数&#xff0c;它分别乘 2、3、4、5、6、7、8、9 时&#xff0c;所得乘积各位数之和却不变。例如 18 就是这样的数&#xff1a;18 的 2 倍是 36&#xff0c;369&#xff1b;18 的 3 倍是 54&#xff0c;549&#xff1b;…… 18 的 9 倍是 162&…

LSTM,全称长短期记忆网络(Long Short-Term Memory),是一种特殊的循环神经网络(RNN)结构

关于lstm超参数设置&#xff0c;每个参数都有合适的范围&#xff0c;超过这个范围则lstm训练不再有效&#xff0c;loss不变&#xff0c;acc也不变 LSTM&#xff0c;全称长短期记忆网络&#xff08;Long Short-Term Memory&#xff09;&#xff0c;是一种特殊的循环神经网络&am…

BUG的跟踪管理

目录 一、bug的类型 二、bug的等级 1、致命错误&#xff1a;------blocker 2、严重错误&#xff1a;------critical 3、一般错误&#xff1a;------major 4、细微错误&#xff1a;------minor 5、改进建议:------enhancement 6、bug类型及等级判断 三、bug的生命周期(…