Node.js+TypeScriptをnodemonで起動してデバッグする
TypeScript歴9ヶ月のエンジニアです。
主にバックエンドの設計、開発を担当しています。
バックエンドのAPIサーバではNode.js+Express.js+TypeScriptを採用しており、開発時はnodemon(とts-node)でAPIサーバを起動しています。
nodemon使用時にVisual Studio Code(以下、VSCode)でデバッグする方法についてのメモです。
環境
VSCode 1.65.0
Node.js 14.x
nodemon 2.0.7
ts-node 10.0.0
nodemonの設定
nodemon.json
{
"watch": [
"src"
],
"ext": "ts",
"exec": "ts-node -r tsconfig-paths/register ./src/index.ts"
}
やりかた
launch.jsonを設定する
launch.jsonを作成して以下のように記載
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Node: Nodemon",
"processId": "${command:PickProcess}",
"restart": true,
"protocol": "inspector"
}
]
}
restart
nodemonでNode.jsを起動する場合、指定したファイルの変更を検知して自動でAPIサーバを再起動してくれます。
restart: true とすることで、node.jsプロセスの再起動時にデバッガープロセスが落ちません。
processId
processId:"${command:PickProcess}" とすることで、デバッガーの起動時にNode.jsのプロセス一覧を表示、attachしたいプロセスを選択できます。
Node.jsは、inspectオプションを指定、もしくは、SIGUSR1 シグナルを受信することでデバッガーの利用ができます。
今回、inspectオプションを指定せずにデバッガーをattach出来たので、デバッガー 起動時にSIGUSR1 シグナルも送っているようです。
(カッコ書きで SIGUSR1 って書いてある)
また、processId の代わりに、port:{port番号(デフォルトは9229})を指定することでもデバッガーをアタッチできるようですが、私の環境ではNode.jsをinspectオプションを指定して起動した場合でもattachできませんでした。
設定が足りない?
port指定する場合、複数のNode.jsを起動している時は注意が必要かも?Node.js起動時にデバッグ用のポートを指定することで回避できるか?とか試したかったのですが、そこまではやっていません。
一応、node.jsのプロセスを確認してprocessId:"xxxx"と指定することも可能です。
(が、一々プロセスIDを調べて指定するのはlaborious って公式にも書いてありました。laborious :骨の折れる)
実行
nodemon
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): src/**/*
[nodemon] watching extensions: ts
[nodemon] starting `ts-node -r tsconfig-paths/register ./src/index.ts`
app running!
Debugger listening on ws://127.0.0.1:9229/b50e934b-233a-436f-920f-48276132f46b
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.
- Debugger attached. されました!
その他の気づきとか
- GithubにNode.js以外のフレームワークでの設定レシピがありました。
- attachってなんて訳せばいいのか分かりませんでした
参考
VSCodeの公式
Github
Node.js
Discussion