第4章 ファイル・HTTP
更新日:2025年12月17日
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や機能が変更される可能性があります。最新情報は公式ドキュメントをご確認ください。