第4章 ファイル・HTTP

更新日:2025年12月17日

本章では、Node.jsの標準モジュールであるfs、path、httpについて解説する。第1章で説明した「Node.js = V8エンジン + サーバー向け機能」の「サーバー向け機能」がこれらに該当する。ファイル操作、パス処理、HTTPサーバー構築の基礎を学び、さらに「サーバー」という言葉の意味と種類についても整理する。

1. 標準モジュール

Node.jsには最初から入っている機能(標準モジュール)がある。npmでインストールする必要はなく、最初から使用できる。

Table 1. 主要な標準モジュール

モジュール 機能
fs ファイルの読み書き
path ファイルパスの操作
http HTTPサーバー/クライアント
https HTTPS通信

2. fsモジュール

2.1 なぜfsモジュールが必要か

Pythonでは標準でファイル操作ができるが、JavaScriptにはもともとファイル操作の機能がなかった。これはJavaScriptがブラウザ用の言語として生まれたためである。

ブラウザでファイルを自由に読み書きできたら危険である。Webサイトを開いただけでPCのファイルを読まれたり書き換えられたりしては困る。そのため、JavaScriptにはファイル操作機能がなかった。Node.jsがサーバー用途のために後から追加したのがfsモジュールである。

2.2 基本的な使い方

const fs = require('fs').promises;  // fsモジュールを読み込む

async function main() {
    // ファイルを読む
    const data = await fs.readFile('input.txt', 'utf8');
    console.log(data);
    
    // ファイルに書く
    await fs.writeFile('output.txt', 'Hello World');
}

main();

Table 2. fsモジュールの主要関数

関数 機能
fs.readFile() ファイルを読む
fs.writeFile() ファイルに書く(上書き)
fs.appendFile() ファイルに追記
fs.unlink() ファイルを削除
fs.readdir() ディレクトリ内容を取得

3. pathモジュール

ファイルパスを扱うとき、WindowsとMac/Linuxで区切り文字が異なる。

Windows:   C:\Users\user\file.txt
Mac/Linux: /home/user/file.txt

pathモジュールはこのOSの違いを吸収してくれる。

3.1 基本的な使い方

const path = require('path');

// パスを結合(OSに合わせて区切り文字を自動選択)
const filePath = path.join('folder', 'subfolder', 'file.txt');
// Windows: folder\subfolder\file.txt
// Mac/Linux: folder/subfolder/file.txt

// ファイル名だけ取得
path.basename('/home/user/file.txt');  // → 'file.txt'

// 拡張子を取得
path.extname('file.txt');  // → '.txt'

// ディレクトリ部分を取得
path.dirname('/home/user/file.txt');  // → '/home/user'

3.2 よく使う関数

Table 3. pathモジュールの主要関数

関数 機能
path.join() パスを結合 path.join('a', 'b') → 'a/b'
path.basename() ファイル名を取得 '/a/b.txt' → 'b.txt'
path.extname() 拡張子を取得 'file.txt' → '.txt'
path.dirname() ディレクトリを取得 '/a/b.txt' → '/a'

4. サーバーとは

httpモジュールの説明に入る前に、「サーバー」という言葉を整理する。この言葉は2つの意味で使われるため混乱しやすい。

4.1 2つの意味

Table 4. サーバーの2つの意味

意味 説明
ハードウェア 物理的なコンピュータ データセンターにあるPC
ソフトウェア リクエストに応答するプログラム Node.jsで書いたコード

Node.jsで「サーバーを作る」とは、リクエストに応答するプログラムを書くことである。そのプログラムは自分のPC(localhost)でテストし、本番ではクラウドやデータセンターのPCで動かす。

Fig. 1 ハードウェアとソフトウェアの関係

データセンター
┌─────────────────────────────────┐
│  サーバーPC(ハードウェア)      │
│  ┌───────────────────────────┐  │
│  │ Webサーバー(ソフトウェア) │  │  ← Node.jsで作るのはここ
│  │ (Node.jsプログラム)      │  │
│  └───────────────────────────┘  │
└─────────────────────────────────┘

4.2 サーバーの種類

「何を提供するか」によってサーバーの名前が変わる。

Table 5. サーバーの種類

種類 役割
Webサーバー HTMLやファイルを返す Apache、Nginx
アプリケーションサーバー プログラムを実行する Tomcat、Node.js
DBサーバー データを保存・検索する MySQL、PostgreSQL

Fig. 2 Webシステムの構成

ブラウザ
   │
   ↓ リクエスト
┌─────────────────┐
│ Webサーバー      │  ← 静的ファイル(HTML、画像)を返す
│ (Apache, Nginx) │
└────────┬────────┘
         │
         ↓ 動的な処理が必要なら
┌─────────────────┐
│ APサーバー       │  ← プログラムを実行
│ (Tomcat, Node)  │
└────────┬────────┘
         │
         ↓ データが必要なら
┌─────────────────┐
│ DBサーバー       │  ← データを取得
│ (MySQL)         │
└─────────────────┘

4.3 Node.jsの立ち位置

Node.jsは少し特殊である。従来のJava等ではWebサーバー(Apache)とアプリケーションサーバー(Tomcat)を別々に用意する必要があったが、Node.jsはWebサーバーとアプリケーションサーバーを兼ねられる。そのため構成がシンプルになる。

Table 6. 従来構成とNode.js構成の比較

構成 必要なもの
従来(Java等) Webサーバー(Apache)+ APサーバー(Tomcat)
Node.js Node.jsだけで両方できる

実務では「Nginx + Node.js」の組み合わせがよく使われる。Nginxが静的ファイルを担当し、Node.jsが動的処理を担当する構成である。

Table 7. Webサーバーの比較

名前 特徴
Apache 老舗。設定が豊富。比較的重い
Nginx 軽量。高速。静的ファイル向き
Node.js JavaScript。動的処理向き

5. httpモジュール

5.1 Webサーバーの仕組み

Webサーバーとは、リクエストを受け取りレスポンスを返すプログラムである。

ブラウザ                    Webサーバー
   │                           │
   │ ── リクエスト(URL) ──→  │
   │                           │ 処理
   │ ←── レスポンス(HTML) ── │
   │                           │

5.2 最小のWebサーバー

Node.jsでは8行でWebサーバーが作れる。

const http = require('http');

const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World');
});

server.listen(3000);
console.log('サーバー起動: http://localhost:3000');

5.3 reqとres

http.createServerの引数にある`req`と`res`は、リクエストとレスポンスを表す。

Table 8. reqとresの役割

変数 正式名 役割
req request ブラウザからの情報(URL、メソッド等)
res response ブラウザへ返す情報(HTML、ステータス等)
http.createServer((req, res) => {
    // reqから情報を取得
    console.log(req.url);     // アクセスされたURL
    console.log(req.method);  // GET, POST など

    // resで応答を返す
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World');
});

5.4 複数URLへの対応

http.createServer((req, res) => {
    if (req.url === '/') {
        res.end('トップページ');
    } else if (req.url === '/about') {
        res.end('About ページ');
    } else {
        res.writeHead(404);
        res.end('Not Found');
    }
});

URLが増えるとif/elseが延々と続き、保守が困難になる。この問題を解決するのがExpress.js(第5章)である。

6. まとめ

Table 9. 第4章のまとめ

概念 内容
fsモジュール ファイル読み書き。JSにもともとなかった機能
pathモジュール パス操作。OS差異を吸収
サーバー(HW) 物理的なコンピュータ
サーバー(SW) リクエストに応答するプログラム
サーバーの種類 Webサーバー、APサーバー、DBサーバー
Node.jsの特徴 WebサーバーとAPサーバーを兼ねられる
httpモジュール Webサーバー作成
req / res リクエストとレスポンス
参考・免責事項
本コンテンツは2025年12月時点の情報に基づいて作成されています。Node.jsおよび関連ツールは活発に開発が進められており、APIや機能が変更される可能性があります。最新情報は公式ドキュメントをご確認ください。