Typescriptではprintfデバッグならぬconsole.logデバッグを使うことがあるが、扱う対象が大きくなるとなんだかわからなくなってくる。そんなときのために、NestJSではpackage.json
でstart:debug
というコマンドが用意されていて、すぐにChromeのInspectorが起動できるようになっている。
ところが、起動しようとしていきなり嵌まったので、解決法を残す。node.jsのバージョンが違うと挙動が変わるらしいので、万能ではないとは思う。
#エラー
node.jsのデバッガを起動するところはうまくいった。
>npm run start:debug
> server@0.0.0 start:debug <プロジェクトルート>
> nodemon --config nodemon-debug.json
[nodemon] 1.18.10
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: <プロジェクトルート>\src/**/*
[nodemon] starting `node --inspect-brk -r ts-node/register -r tsconfig-paths/register src/main.ts`
Debugger listening on ws://127.0.0.1:9229/8dd8a608-7627-4ad7-801e-bf112d379e6f
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.
Chromeでchrome://inspect
にアクセスし、対象のポート(ここでは9229
)を選択するところも問題なかった。
ところが、inspect
を押したらエラーが発生し、コマンドプロンプトには以下のエラーが表示された。
internal/modules/cjs/loader.js:605
throw err;
^
Error: Cannot find module 'src/main.ts'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:603:15)
at Module._compile (internal/modules/cjs/loader.js:700:31)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:732:10)
at Module.load (internal/modules/cjs/loader.js:620:32)
at tryModuleLoad (internal/modules/cjs/loader.js:560:12)
at Function.Module._load (internal/modules/cjs/loader.js:552:3)
at Module.require (internal/modules/cjs/loader.js:657:17)
at Module._preloadModules (internal/modules/cjs/loader.js:842:12)
at prepareUserCodeExecution (internal/bootstrap/node.js:297:7)
at startExecution (internal/bootstrap/node.js:275:5)
Waiting for the debugger to disconnect...
Chromeのデバッグウィンドウにも以下のようにエラーメッセージが表示されていた。
#GitHubの情報
エラーメッセージのinternal/modules/cjs/loader.js:605
とinspector
などのキーワードから、Node11.4.0でエラーが起きるという書き込みを見つけた。バージョンでエラーが出るようになるので新しいバージョンは怖い…
Using ./index.js on the command line instead of index.js will make it work.
node -r ./preload.js --inspect-brk ./index.js
Not suggesting that requiring ./ to start the path is OK or anything. Just offering it up in case it helps someone track what's gone wrong here.
どうやら、パスの指定で./
を付けるとうまくいくらしい。
#処置
NestJS
のテンプレートで生成されるnodemon-debug.json
で、パスをsrc/main.ts
から./src/main.ts
に修正したらあっさり直った。そのうちバグが修正されるかもしれないが、今はこれでOKそう。
{
"watch": ["src"],
"ext": "ts",
"ignore": ["src/**/*.spec.ts"],
"exec": "node --inspect-brk -r ts-node/register -r tsconfig-paths/register src/main.ts"
}
{
"watch": ["src"],
"ext": "ts",
"ignore": ["src/**/*.spec.ts"],
"exec": "node --inspect-brk -r ts-node/register -r tsconfig-paths/register ./src/main.ts"
}