nodejsの組み込みデバッガを使用して、サーバーサイド開発を行う


nodejsで、サーバーサイド開発を行う際に、変数とかの中身を調べるために、console.log()で毎回出力していたが、何かと不便。
調べてみたところ、node-inspectorというライブラリを入れると、ブラウザのデバッグツールでデバックできるというので試したところ、下記のエラーが出て使えない。

/usr/local/lib/node_modules/node-inspector/lib/InjectorClient.js:111
      cb(error, NM[0].ref);

TypeError: Cannot read property 'ref' of undefined

同じようにはまってる人の質疑応答があったので読んでいたら、最後にnode自体に同等の機能が組み込まれたから、それ使えって書いてあった。

使い方

最初使い方がよくわからなかったので、記録を残す。
今、sailsを使っているので、それを使った時の設定方法なども併せて記載する。

バージョン

nodejs: v6.7.0
sails: 0.12.9

sailsを適当にセットアップ

とりあえず、局所的にsailsが動くように設定とインストール。よくわからない場合やグローバルに入れたい場合は、調べればすぐ出るので、それで入れる。

PATH=./node_modules/.bin:$PATH
typeset -U path

npm install sails
sails new inspect_test
cd inspect_test
rm -rf node_modules
npm install

アプリケーションを作成

とりあえず、コントローラーを作って、アクセスできるように設定する。
コード中に、debugger;と入れると、そこがブレークポイントになる。

sails generate controller hoge

sed -i -e "/};/i,'/hoge': { controller: 'HogeController', action: 'index' }" config/routes.js
sed -i -e "/};/iindex: function(req, res) {debugger; res.send('hogehaoge')}" api/controllers/HogeController.js
echo 'module.exports = {port:9000}' > config/local.js

起動

inspectのポート番号は指定しなければ、デフォルトが使用される。

node --inspect=9001 app.js

アクセス

起動時に下記のようなURLが表示されるので、localhost部分をサーバーのIPなどに変更して、chromeのアドレス欄に入れ、アクセスするとデバッグツールが表示される。

chrome-devtools://devtools/remote/serve_file/@xxxxxxxxxxxxxx/inspector.html?experiments=true&v8only=true&ws=localhost:9001/node

成功すれば、nodeのコンソールに下記のメッセージが表示される。

Debugger attached.

あとは、どのブラウザでも良いので、アプリケーションにアクセスすると、debugger;と入れたところで処理が止まり、コードがデバッグツールに表示される。もちろん、変数内を見たり、ステップ実行なども可能。

http://localhost:9000/hoge

foreverを設定する

開発時は、コード変更のたびに、アプリケーションを再起動する必要がある。foreverを使用すると、変更したら勝手に再起動するので、楽になるので入れる。デバッガの設定もする。

インストール&設定

npm install forever
cat << EOF > .foreverignore
**/.tmp/**
assets/**
views/**/*.ejs
node_modules/**

.idea/**

.git/**
EOF

起動

nodeにオプションを渡したい場合は、-cnodeコマンドごと再設定する。

forever -c 'node --inspect=9001' -w app.js