Node.js スクリプトからの HTTP 通信時にプロキシを通すには request が楽チン

社内開発のため、プロキシ制限がある中で Node.js スクリプトを書いていた。Node.js スクリプトから外部サーバに HTTP 通信して GET とかしたいのだが、プロキシの通し方が分からなかった。調べてみても、Node.js サーバを構築した時の設定の話ばかりで、ちょっとした HTTP GET をやりたい時の解説が少なかった。

色々探し回った結果、request という npm パッケージを使って HTTP 通信するのが一番楽そうだった。

request の使い方

適当な作業ディレクトリで $ npm init -y して package.json が置いてある前提で。

まずは request モジュールをインストールする。

$ npm install -S request

次に、スクリプトを以下のように書く。

const request = require('request');

request.post({
  // 何かユーザ一覧を取得するような API へのアクセス
  url: 'https://my-api-server.com/api/users',
  // メソッド指定 (未指定時のデフォルトは GET)
  method: 'GET',
  // プロキシ URL を指定する
  proxy: 'http://my-proxy.com/',
  // 以降は任意なサンプル
  headers: {
    'X-My-Token': 'HTTP Header も指定可能'
  },
  body {
    'name': 'POST や PUT 時のリクエストボディが付与できる'
  },
  form: {
    'myMessage': 'application/x-www-form-urlencoded なフォーム送信とかも出来る'
  }
}, (error, res, body) => {
  if(error) {
    // エラー時
  }
  
  // 処理成功時
  console.log(body);
});

こんな Node.js スクリプトを、main.js といった名前で保存しておき、

$ node main.js

などと叩いて実行すれば、ちゃんと http://my-proxy.com/ プロキシを経由したアクセスができるようになっている。

http モジュールを使って HTTP GET とかするよりオプションが書きやすいので、request オススメ。

プロキシを通すために試したけどダメだったこと

.npmrcproxy および https-proxy を設定して、その状態で $ node main.js のように実行しても、プロキシ設定は上手く行っていないようだった。

また、~/.bash_profile などで、export https_proxy=http://my-proxy.com/ のように設定しておいても反映されなかった。http_proxyHTTP_PROXYhttps_proxyHTTPS_PROXY と大文字・小文字で4パターン設定したがダメ。

tunnel という npm パッケージを使って http モジュールのエージェントにするやり方は自分の環境だと上手く行かなかった。