node.jsの標準搭載のdebugを使ってみる

node.jsの標準搭載のdebugを使ってみる

node.js標準搭載のdebugを使ってみます。
さくらVPSを使用して、外部から実際に接続することを前提としています。
最低限のセキュリティ対策をした上で、実験後開いたポートはすぐ閉じるようにしてください。
セキュリティの問題が起こる可能性は低いですが、自己責任で行ってください。

  1. 前提
  2. 一番簡単なhttpサーバの実装
  3. debugを試す
  4. おわり

0. 前提

・さくらVPS CentOS7
・node.js v7.4.0
・firewallは有効にしてあり、最低限のセキュリティ対策はしてある

1. 一番簡単なhttpサーバの実装

適当なディレクトリを作成し、そこで作業します。

$mkdir testapp
$cd testapp

新しいファイル作成し簡単なコーディングを行います。

$vim server.js

server.jsに以下を入力してください。

var http = require('http');  
http.createServer(function(req, res) {  
  res.writeHead(200, {'Content-Type' : 'text/plain'});  
  res.write('Hello World!!');  
  res.end();  
}).listen(8000);  

今回は8000番ポートを使用しています。
8000番ポートを一時的に開放します。

$firewall-cmd --add-port=8000/tcp

作成した簡易サーバを起動します。

$node server.js

外部から接続をしてみます。
http://(vpsのipアドレス):8000/

Hello World!!が表示されます。

2. debugを試す

一度サーバを停止します。
Ctrl + Z server.jsを以下のように編集します

var http = require('http');  
http.createServer(function(req, res) {  
  debugger;  ★この行を追加
  res.writeHead(200, {'Content-Type' : 'text/plain'});  
  res.write('Hello World!!');  
  res.end();  
}).listen(8000);  

デバッグモードで起動します。
デバッグモードは、node debug ファイル名 となります。

$node debug server.js

すると、以下のように表示されます。

[ユーザ名@ホスト名 ディレクトリ名]$ node debug server.js
< Debugger listening on 127.0.0.1:5858
connecting to 127.0.0.1:5858 ... ok
break in server.js:1
> 1 var http = require('http');
  2 http.createServer(function(req, res) {
  3   res.writeHead(200, {'Content-Type' : 'text/plain'});
debug>

サーバー起動時にどのような順序で処理が実行されているのかを観察することができます。
主な操作は以下のとおりです。

コマンド : 内容
n : 次の処理へ
s : 次の処理へ(関数等の中身まで詳細に追う)
o : 一つ外側の処理へ
c : 一行一行止める処理をやめる
exec (コマンド) : 簡単なnode.jsのスクリプトを実行する

サーバの立ち上げを最後まで行ってしまいます。

>c

その後、手持ちのスマホなどから、
http://(vpsipアドレス):8000/
へアクセスします。

すると、debugger;の部分で停止することがわかります。
debuggarは、その部分が実行された場合に処理を一旦止めてくれます。
debugモードを使うと、実際にアクセスしたときにどのような流れで処理が行われるのかを観察することができます。

また、debugger;の行で止まっている時に、reqの中身を見てみます。

> exec console.log(req)

中身が多すぎて全て表示されませんが、ざっと見てみると、自分がどんな環境からアクセスしたのか、という情報などを確認することができます。

より詳しい説明は、公式のDocumentationを参考ください。

3. おわり

サーバを停止します。
Ctrl + Z
開いたポートは閉じます

$firewall-cmd --remove-port=8000/tcp
$firewall-cmd --list-ports
(8000が表示されないことを確認)