VSCode でデバッグ実行すると「node.exe: bad option: --inspect-brk」とか「connect ECONNREFUSED 127.0.0.1」とかで怒られる件

前提

  • VSCode v1.22
  • Node v6.10

VSCode は最新だが Node が古い(特に大幅なアップデートが加わった v8 よりも古い)というケース。

事象

デバッグ実行すると、VSCode では以下のように --inspect-brk を node.exe に与えようとするが、

...node.exe ...%appdata%/npm/mocha.cmd --inspect-brk=24783 test.js

node v6 以前は inspect に対応していないためエラーが出てしまい、デバッグ実行できない。

また、上記はデバッグ実行時に利用されるローカルサーバーを立ち上げられないことも意味するため、タイムアウト後(デフォルトは10秒)に VSCode が「connect ECONNREFUSED 127.0.0.1」という「デバッグ実行サーバーに繋がらないんだけど?」的なエラーも吐く。

原因

node のバージョンが古い。

VSCode では node を用いたデバッグ実行の際に inspect というオプションを与えるが、このオプションは node v6 ではサポートされていない(v8 からサポートされたものである)。

解決策

解決策として以下二つがあるが、

  • node をバージョンアップする
  • 古い node 用のオプションを指定する

今回は手軽な後者を紹介する。

VSCode の launch.json に「古い node のモードで実行してください」を指定してやる。具体的に言うと "protocol": "legacy" を指定する。

{
    ...
    "configurations": [
        {
            "type": "node",
            "name": "mocha test.js",
            "request": "launch",
            "program": "${workspaceRoot}/test.js",
            "stopOnEntry": false,
            "runtimeExecutable": "${env:APPDATA}/npm/mocha.cmd",
            "runtimeArgs": [],
            "args": [],
            "cwd": "${workspaceRoot}",
            "console":"integratedTerminal",
            "protocol": "legacy" // ★ここ
        }
    ]
}

これでデバッグ実行が出来るようになるはず。