デザインについての学習メモブログ

Node.js入門(2):コアモジュールを使ったファイル操作とWebサーバー構築

記事内に広告が含まれています。

Node.js入門(2):コアモジュールを使ったファイル操作とWebサーバー構築

Node.jsには、外部ライブラリをインストールしなくても使える「コアモジュール」が豊富に用意されています。

この記事では、実務でもよく使うファイル操作簡単なWebサーバーの作り方を、実践的なコード例とともに解説します。

💡この記事でわかる事

以下の内容を習得することができます:

  1. Node.jsコアモジュールとは
  2. ファイル操作(fsモジュール)
  3. 簡単なWebサーバーの構築(httpモジュール)
  4. 実践:静的ファイルを配信するWebサーバー

1. Node.jsコアモジュールとは

Node.jsのコアモジュールは、Node.jsに標準で組み込まれているモジュール群です。

npm installなしで使えるため、素早く開発を始められます。

主なコアモジュール:

  • fs: ファイルシステム操作
  • http/https: Webサーバー・HTTPクライアント
  • path: パス操作
  • os: OS情報の取得
  • events: イベント駆動プログラミング

2. ファイル操作(fsモジュール)

まずは、ローカルのファイルをNode.jsで操作してみましょう。

2.1 ファイルの読み込み

JavaScript
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 ファイルの書き込み

JavaScript
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 ディレクトリ操作

JavaScript
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 ファイルの削除とリネーム

JavaScript
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サーバー

JavaScript
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 ルーティングを実装する

JavaScript
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などの静的ファイルを配信するサーバーを作りましょう。

JavaScript
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)

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を使いこなせるようになります。