【Node.js】Webサーバーの本体となるJavaScriptファイルを1行ずつ見ていく

前回はNode.jsでサーバーを立ち上げてブラウザで「Hello World」と表示させるまでやりました。
今回は app.js に入れた6行のコードの意味を1行ずつみていきます。

 var http=require('http');
 var server = http.createServer(function(req, res) {
   res.writeHead(200, {'ContentType': 'text/plain'});
   res.end('HelloWorld');
 });
 server.listen(3000); 

パッケージを指定して使えるようにする

まずは最初のの1行。
Node.jsでは require という構文を指定してパッケージ名を指定することで外部のパッケージを使用できるようになります。

 var http=require('http');

Node.jsで使用するパッケージには主に2種類あり、Node.js本体の機能として利用できるモジュール外部のモジュールです。

前者はHTTPやファイルへのアクセスなどのOSの機能を使用するものがメインで、後者はExpress等の高度な機能を利用するためのものです。
Node.jsに依存しているものもあれば、ブラウザと共通で利用できるものもあります。

ここで使用している http は前者のNode.js本体の機能であり、OSのHTTP通信を使うための機能にNode.jsからアクセスするためのものでした。
これを使用してHTTPを使用するサーバーを立ち上げたり、外部のサーバーにHTTPリクエストを送信するHTTPクライアントとしての機能を構築することもできます。

簡単にいうと、 http を使うことで自分のWebサイトをネット上に更新したり、フォームなどからデータを送受信したりすることができるのです。

“http” を使ってサーバーを作成する

指定したパッケージを “http” を実際に利用してサーバーを作成しているのが以下のコードです。

var server = http.createServer( サーバー側の処理 );

httpのメソッドである .createServer()を使ってHTTPリクエストを待機するWebサーバーを構築していきます。

.createServer()でWebサーバーのインスタンスを作成し、引数にはヘッダー情報や表示するコンテンツを設定する等様々な処理を記述することになります。
一般的に引数には、 req と res という2つの引数を持つ無名関数を渡して処理を記述しています。

 var server = http.createServer(function(req, res) {
   // ここに処理を記述する
 }); 

createServer() 関数は、HTTPリクエストを受信するたびにカッコ内の関数が呼び出され、そのアクセスの内容に応じて処理の中身を変えることができます。
リクエストに関する情報は req に入っているので、必要に応じて適宜中身を参照します。

   res.writeHead(200, {'ContentType’: 'text/plain'});
   res.end('HelloWorld');

res の各メソッドに情報を渡すことで、Webサーバーを構築することが可能です。
この例では res.writeHead() でヘッダを記述して、 res.end() で具体的なレスポンスを指定しています。

つまり、正常にレスポンスが返されたことを示すステータスコードの200を指定して、コンテンツタイプには単純なテキストファイルであることを示す ‘text/plain’ を指定しています。

このように作成したサーバーのインスタンスを server という変数に確保しました。

特定のポートを指定してサーバーを起動する

実際にPCの特定のポートでサーバーとして起動するには .listen() というメソッドを呼び出します。
このメソッドではサーバーが利用するポート番号を指定する必要があります。
今回は3000番コードを指定しています。

server.listen(3000);

まとめ

Node.jsでWebサーバーを作成する時は以下のようになります。

  1. http(SSLを使用するときはhttps)を読み込む
  2. サーバーのインスタンスを作成
  3. 特定のポートでサーバーを起動してリクエストを受け待つ

あとがき

レスポンスヘッドを任意に設定できるというのはすごいですね。
仕事でバックエンドエンジニアがレスポンスヘッドの設定をどうのこうのって言っていましたが、きっとこんな感じで設定しているのでしょう(きっとNode.jsではない)

ステータスコードも設定できるのでエラーコードが返ってきたときの動作をテストしたい時にすごく便利だと思いました。

まだ完全に理解しておらず、漠然としかイメージできていませんが、これから学習していくうちに理解が深まるだろうと期待しています。

フォローお願いします