Node.js の機能だけでシンプルな HTTP サーバを作ってみる

Node.js でサーバを立てるというと、Express というパッケージを使うことが多いが、今回はコレを使わず、組み込みの fshttp モジュールだけを使って簡単なサーバを立ててみる。

今回は、styles.cssscripts.js という外部ファイルを読み込む index.html を作っておき、コレを HTTP サーバで配信してみる。

話を簡単にするため、以下のようなファイル構成にしてみる。

プロジェクトディレクトリ
├ server.js   … サーバ処理を記述する Node.js スクリプト
├ index.html
├ styles.css
└ scripts.js

server.js の中身は以下のようになった。

const fs   = require('fs');
const http = require('http');

http.createServer((req, res) => {
  // リクエスト URL を取得する
  let url = req.url;
  console.log(url);
  // 「/」に対するリクエストには index.html を返す
  if(url === '/') {
    url = '/index.html';
  }
  
  // レスポンスデータを格納する変数
  let responseData = null;
  
  // fs を利用してリクエスト URL に該当するファイルを読み込む (このファイルからの相対パスとして扱う)
  fs.readFile(`.${url}`, (error, data) => {
    if(error) {
      // ファイルが読み取れなかった場合は 404 エラーとして返答する
      console.log('404 Error');
      res.writeHead(404);
    }
    else {
      // ファイルの内容が受け取れたらレスポンスデータとして設定する
      responseData = data;
      
      // 拡張子をキーに Content-Type を得るための連想配列を定義しておく
      const extToType = {
        'html': 'html',
        'js'  : 'javascript',
        'css' : 'stylesheet'
      };
      
      // ファイル名から拡張子を取得する
      const fileNameArray = url.split('.');
      const ext = fileNameArray[fileNameArray.length - 1].toLowerCase();
      
      // Content-Type が分かればそれに、分からなければプレーンテキストとして返す
      const type = extToType[ext] || 'plain';
      // HTTP 200 として返答する
      res.writeHead(200, { 'Content-Type': `text/${type}` });
    }
    
    // レスポンスデータを設定し、レスポンスを返す
    res.end(responseData);
  });
}).listen(9999);  // サーバをポート 9999 で起動する

console.log('http://localhost:9999/');

コレを $ node server.js という風に実行すると、http://localhost:9999/ でページにアクセスできるようになる。


大変シンプルだが、このような作りでサーバが構築できることが学べた。