为什么代理选项在节点本机获取中不可用?

Joh*_*ohn 12 fetch node.js fetch-api node-fetch

我最近开始使用原生的 fetch 功能(节点 17+)

我今天意识到它缺少一些功能node-fetch,例如agent

这是为什么?

有计划添加吗?

很遗憾,因为我需要添加node-fetch到我的项目中

jos*_*736 7

实际的答案是为什么您习惯的模块选项不可用http,也许令人惊讶的是,节点的内置fetch()全局不使用传统内置http/https模块提供的 HTTP 堆栈。

\n

相反,它使用并行的、从头开始的 HTTP 堆栈重写,称为undici

\n

鉴于fetch()HTTP 堆栈与标准 HTTP 堆栈完全分离,因此您可以提供给http.getet al 的选项不适用于fetch().

\n

undici 的文档可在此处获取。httpAgent被替换为Dispatcher. 您可以将自定义传递Dispatcherfetch(\xe2\x80\xa6, { dispatcher }),它允许您自定义fetchHTTP 行为。

\n

  • 这取决于“代理”到底是什么。如果它是传统的 `http.Agent`,则不,[`Dispatcher` API](https://undici.nodejs.org/#/docs/api/Dispatcher) 与 [`http.Agent` API 完全不同](https://nodejs.org/dist/latest-v18.x/docs/api/http.html#class-httpagent),因此将 `http.Agent` 传递给 `dispatcher` 选项将不起作用。如果它是“undici.Agent”,那么是的,这是正确的。`dispatcher` 选项采用 `undici.Dispatcher`,它基本上是一个抽象基类;`undici.Agent` 继承自它。 (2认同)