🌐
Node.jsのfetchでプロキシを利用する
Node.jsのv18からfetch
が使えますが、このfetch
は環境変数のHTTPS_PROXY
やHTTP_PROXY
、NO_PROXY
などに応じてプロキシを使ってくれるといったようなことはありません。
fetch
を使っている箇所を適宜プロキシを使う形に書き換えるのは面倒なのと、利用しているライブラリ内でfetch
を使っていると変更するのが困難な場合も発生しそうです。(実際発生してこれを書いています)
Node.jsのfetchで環境変数に応じてプロキシを利用する方法
一律設定する方法が無いか調べたところ、Node.jsのfetch
の実装として利用されているundiciのEnvHttpProxyAgent
とsetGlobalDispatcher
を利用すればできることがわかりました。
コードとしては下記のようになります。
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