🌐

Node.jsのfetchでプロキシを利用する

2025/01/08に公開

Node.jsのv18からfetchが使えますが、このfetchは環境変数のHTTPS_PROXYHTTP_PROXYNO_PROXYなどに応じてプロキシを使ってくれるといったようなことはありません。

fetchを使っている箇所を適宜プロキシを使う形に書き換えるのは面倒なのと、利用しているライブラリ内でfetchを使っていると変更するのが困難な場合も発生しそうです。(実際発生してこれを書いています)

Node.jsのfetchで環境変数に応じてプロキシを利用する方法

一律設定する方法が無いか調べたところ、Node.jsのfetchの実装として利用されているundiciのEnvHttpProxyAgentsetGlobalDispatcherを利用すればできることがわかりました。

コードとしては下記のようになります。

import { EnvHttpProxyAgent, setGlobalDispatcher } from "undici";

if (process.env.HTTPS_PROXY || process.env.HTTP_PROXY) {
  setGlobalDispatcher(new EnvHttpProxyAgent());
}

// 上記設定をしておくと、どのfetchでもURLと環境変数に応じてプロキシを利用してくれる
fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(json => console.log(json));

undiciを依存関係として追加する必要があります。手元では下記の組み合わせでうまく動きました。

  • Node.js : v22.12.0
  • undici : 7.2.0

確認時に使ったプロジェクトは下記になります。

なお、EnvHttpProxyAgentは新しい機能で、まだ安定したものではなく実験的な機能といった位置づけです。そのため、EnvHttpProxyAgentを使うと警告が出ます。

root@823a062e6d03:/workspaces/node-sandbox/node-fetch-proxy# HTTPS_PROXY=https://proxy.example.com:1234 node index.js 
(node:5329) [UNDICI-EHPA] Warning: EnvHttpProxyAgent is experimental, expect them to change at any time.
(Use `node --trace-warnings ...` to show where the warning was created)
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }

他のJavaScriptランタイムはどうなっているか

DenoもBunもfetchで環境変数を見てくれて、適切にプロキシを利用してくれるようです。(実際試せてないけど、ドキュメント見る限り)

Node.jsもデフォルトで環境変数を元に動いてくれるとよいですね!

Discussion