Node.jsには、外部ライブラリをインストールしなくても使える「コアモジュール」が豊富に用意されています。
この記事では、実務でもよく使うファイル操作と簡単なWebサーバーの作り方を、実践的なコード例とともに解説します。
💡この記事でわかる事
以下の内容を習得することができます:
- Node.jsコアモジュールとは
- ファイル操作(fsモジュール)
- 簡単なWebサーバーの構築(httpモジュール)
- 実践:静的ファイルを配信するWebサーバー
Contents
1. Node.jsコアモジュールとは
Node.jsのコアモジュールは、Node.jsに標準で組み込まれているモジュール群です。
npm installなしで使えるため、素早く開発を始められます。
主なコアモジュール:
- fs: ファイルシステム操作
- http/https: Webサーバー・HTTPクライアント
- path: パス操作
- os: OS情報の取得
- events: イベント駆動プログラミング
2. ファイル操作(fsモジュール)
まずは、ローカルのファイルをNode.jsで操作してみましょう。
2.1 ファイルの読み込み
const fs = require('fs');
// 同期的な読み込み(シンプルだが処理がブロックされる)
try {
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('ファイル読み込みエラー:', err);
}
// 非同期的な読み込み(推奨)
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error('ファイル読み込みエラー:', err);
return;
}
console.log(data);
});
// Promise版(async/awaitで使える)
const fsPromises = require('fs').promises;
async function readFileAsync() {
try {
const data = await fsPromises.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('ファイル読み込みエラー:', err);
}
}2.2 ファイルの書き込み
const fs = require('fs');
// 新規作成または上書き
fs.writeFile('output.txt', 'Hello, Node.js!', 'utf8', (err) => {
if (err) {
console.error('書き込みエラー:', err);
return;
}
console.log('ファイルを作成しました');
});
// 追記
fs.appendFile('output.txt', '\n追加のテキスト', 'utf8', (err) => {
if (err) {
console.error('追記エラー:', err);
return;
}
console.log('テキストを追記しました');
});2.3 ディレクトリ操作
const fs = require('fs');
const path = require('path');
// ディレクトリの作成
fs.mkdir('new-folder', { recursive: true }, (err) => {
if (err) throw err;
console.log('ディレクトリを作成しました');
});
// ディレクトリ内のファイル一覧を取得
fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('ファイル一覧:', files);
// 各ファイルの詳細情報を取得
files.forEach(file => {
const filePath = path.join('.', file);
fs.stat(filePath, (err, stats) => {
if (err) throw err;
console.log(`${file}: ${stats.isDirectory() ? 'ディレクトリ' : 'ファイル'}`);
});
});
});2.4 ファイルの削除とリネーム
const fs = require('fs');
// ファイルの削除
fs.unlink('delete-me.txt', (err) => {
if (err) throw err;
console.log('ファイルを削除しました');
});
// ファイルのリネーム・移動
fs.rename('old-name.txt', 'new-name.txt', (err) => {
if (err) throw err;
console.log('ファイル名を変更しました');
});3. 簡単なWebサーバーの構築(httpモジュール)
3.1 最もシンプルなWebサーバー
const http = require('http');
const server = http.createServer((req, res) => {
// レスポンスヘッダーの設定
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
// レスポンスボディの送信
res.end('Hello, Node.js Webサーバー!');
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`サーバーが起動しました: http://localhost:${PORT}`);
});3.2 ルーティングを実装する
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const pathname = parsedUrl.pathname;
// ルーティング
if (pathname === '/' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end('<h1>ホームページ</h1><p>ようこそ!</p>');
} else if (pathname === '/about' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end('<h1>About</h1><p>このサイトについて</p>');
} else if (pathname === '/api/data' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Hello API', timestamp: Date.now() }));
} else {
res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
res.end('<h1>404 Not Found</h1>');
}
});
server.listen(3000, () => {
console.log('サーバー起動: http://localhost:3000');
});4. 実践:静的ファイルを配信するWebサーバー
ファイル操作とWebサーバーの知識を組み合わせて、HTMLやCSSなどの静的ファイルを配信するサーバーを作りましょう。
const http = require('http');
const fs = require('fs');
const path = require('path');
// MIMEタイプのマッピング
const mimeTypes = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'text/javascript',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.gif': 'image/gif',
'.svg': 'image/svg+xml',
'.ico': 'image/x-icon'
};
const server = http.createServer((req, res) => {
// URLから/を取得した場合はindex.htmlを返す
let filePath = '.' + req.url;
if (filePath === './') {
filePath = './index.html';
}
// ファイルの拡張子を取得
const extname = String(path.extname(filePath)).toLowerCase();
const contentType = mimeTypes[extname] || 'application/octet-stream';
// ファイルを読み込んで返す
fs.readFile(filePath, (err, content) => {
if (err) {
if (err.code === 'ENOENT') {
// ファイルが見つからない場合
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end('<h1>404 Not Found</h1>', 'utf-8');
} else {
// サーバーエラー
res.writeHead(500);
res.end(`Server Error: ${err.code}`, 'utf-8');
}
} else {
// 成功した場合
res.writeHead(200, { 'Content-Type': contentType });
res.end(content, 'utf-8');
}
});
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`静的ファイルサーバー起動: http://localhost:${PORT}`);
});テスト用のHTMLファイル(index.html)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Node.js 静的サーバー</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Node.jsで作った静的ファイルサーバー</h1>
<p>コアモジュールだけで動いています!</p>
<script src="script.js"></script>
</body>
</html>まとめ
この記事では、Node.jsのコアモジュールを使った基本的なファイル操作とWebサーバーの構築方法を学びました。
重要なポイント:
- fsモジュールでファイルの読み書き、ディレクトリ操作が可能
- 非同期処理を使うことで、パフォーマンスの良いアプリケーションが作れる
- httpモジュールで外部ライブラリなしでWebサーバーを構築できる
- ルーティングやMIMEタイプの処理を理解すれば、実用的なサーバーが作れる
実際のプロジェクトでは、Expressなどのフレームワークを使うことが多いですが、コアモジュールの仕組みを理解しておくことで、より深くNode.jsを使いこなせるようになります。
次回予告: 次のステップとしては、イベント駆動プログラミングについても学んでみましょう!
シリーズ記事
第1回: Node.jsとは?環境構築の実践-インストールからプロジェクト作成まで
第2回:コアモジュール基礎:ファイル操作とWebサーバー← 今回
第3回: イベント駆動プログラミング
第4回: ストリーム処理をマスターする
第5回: 堅牢なエラーハンドリング
第6回: パフォーマンス最適化テクニック


























