pkkiblog 暇なときに投稿しています
サーバー パソコン プログラミング レビュー

【Node.js入門③】超簡単にWebアプリ開発!Expressの使い方!

schedule 2025年12月12日  update 2025年12月12日        
【Node.js入門③】超簡単にWebアプリ開発!Expressの使い方! サムネイル

皆さんこんにちは、pkkiです!

皆さんは、

 「Webアプリ開発してみたいけど、どうやってすれば良いのか分からない…」
 「Node.jsインストールしたばかりで、Expressの使い方がさっぱりわからない…」
 「Expressの使い方を忘れた…」

と思ったことはありませんか?

そこで今回は、
「超簡単にNode.jsでExpressを使用して、超簡単にWebアプリ開発をする方法!」
を初心者向けに丁寧に解説します!

Webアプリ開発…難しそうだな…

杞憂ですね!
この記事を見れば、誰でもある程度Expressを使いこなすことができます!

おーーそれは有難い!

それでは解説していきましょう!

Express(Express.js)とは?

Expressとは、Node.js用の高速で自由度が高く、軽量なWebフレームワークです。

フレームワークとは
アプリケーション開発を効率化するために、あらかじめ設計された「骨組み」や「土台」となるソフトウェアのことです。
npm install express --save

また、Node Package Manager(NPM)と呼ばれるNode.jsのパッケージを管理するためのシステムに登録されており、誰でもnpmからExpressを導入することができます!

また、npmについては上の記事で詳しく解説しているので、是非そちらをご覧ください!

では早速、Expressを使ってWebアプリを開発していきましょう!

Expressのインストール方法

新しいフォルダ

最初に、Webアプリ開発をするためのフォルダーを作成してください。

npm init
npm init

次に、上のコマンドを実行してください。
※npmで管理するためのpackage.jsonファイルを作成する初期化コマンドです。

また、詳しくはこちらの記事で解説しています。

もし、Node.jsを入れてない場合は、こちらをご覧ください。

npm install express

続いて、こちらのコマンドを実行してください。
このコマンドは、Expressをフォルダにインストールして、依存関係リストに追加するコマンドです。

Node.js package.json

このように、「package.json」の「dependencies」に「express」が追加されていれば成功です!

では、早速使い方を解説します!

ExpressでHello Worldを出力するWebアプリを作ってみよう!

Node.js index.js

最初に、フォルダ内に「index.js」を作成してください。

const express = require('express'); //expressの読み込み
const app = express(); // Expressアプリケーションのインスタンスを作成
const port = 3000; //port変数に3000代入

// ↓app.get = getリクエスト受信時↓
app.get('/', (req, res) => { //path無しの時(例:http://localhost:3000/)
  res.send('Hello World!'); // res = 返答 send = "送る"
});

app.listen(port, () => { //portでlisten(聞く)つまり、3000で外部からのアクセスに備えて待機する
  console.log(`Example app listening on port ${port}`);//console=コンソール log=ログ(記録)
});

次に、作成したindex.jsファイルを開いて、このプログラムを入力してみましょう。

node index.js

そして、ターミナルで上のコマンドを実行してみましょう!

Node.js JavaScript Tuntime 
パブリック ネットワークとプライベート ネットワークにこのアプリへのアクセスを許可しますか?

もし、このように表示されたら「許可」をクリックしてください。

node index.js

このように、「Example app listening on port 3000」と表示されたら起動成功です。

最後に、http://localhost:3000 を開いてみましょう。

localhost

このように、「Hello World!」と出力されたら成功です!

Expressの高速ウェブアプリ生成ツールを使って学ぼう

npx express-generator

次に、Expressのある程度の基礎が詰まった高速アプリ生成ツールを使ってみます。

npx express-generator

最初に、コンソールで上のコマンドを実行してください。

次に、上の画像の様に、すべての質問に「y」を入力して「Enter」を押してください。

npx express-generator 生成されたフォルダ・ファイル

そうすると、このように色々生成されます。

これを今から解説していきます。

しかし、それをする前にどのように動作するのか実行してみましょう。

npm install http-errors path cookie-parser morgan

最初に、上のコマンドを実行して必要なパッケージをインストールしましょう。

npm start

次に、上のコマンドを実行したら開始できます。

npm start

そして、http://localhost:3000 を開いてみましょう。

Express 
Welcome to Express

このように表示されます。

ファイル・フォルダの構成

npx express-generator 生成されたフォルダ・ファイル

次に、それぞれのフォルダ・ファイルの役割を解説します。

1. bin フォルダ

npx express-generator 生成されたフォルダ・ファイル binフォルダ

「お店の開店スイッチ」

2. public フォルダ

npx express-generator 生成されたフォルダ・ファイル publicフォルダ

「お店の内装・インテリア置き場」

3. routes フォルダ

npx express-generator 生成されたフォルダ・ファイル routesフォルダ

「案内係(ウェイター)」

4. views フォルダ

npx express-generator 生成されたフォルダ・ファイル viewsフォルダ

「料理の盛り付け場(画面を作る場所)」

5. app.js ファイル

「お店のルールブック(設計図)」

それぞれのファイルのプログラムを解説

app.js

アプリケーションの「メイン設定」ファイルです。どのような機能を使うかを定義します。

var createError = require('http-errors');   // エラー作成用モジュールを読み込み
var express = require('express');           // Express本体を読み込み
var path = require('path');                 // パス操作用モジュールを読み込み
var cookieParser = require('cookie-parser');// クッキー解析用モジュールを読み込み
//クッキーは、ウェブサイトがユーザーのブラウザ(ChromeやSafariなど)
//に保存する小さなテキストファイルのことです。
//あの「パスワードを保存する」もこれを利用しています
var logger = require('morgan');             // ログ出力用モジュールを読み込み

var indexRouter = require('./routes/index'); // 自作のルーター(トップページ用)を読み込み
var usersRouter = require('./routes/users'); // 自作のルーター(ユーザーページ用)を読み込み

var app = express(); // Expressアプリケーションのインスタンスを作成(ここからアプリの設定が始まります)

// view engine setup (画面表示の設定)
app.set('views', path.join(__dirname, 'views')); // 画面テンプレートファイルがある場所を 'views' フォルダに指定
app.set('view engine', 'jade');                  // テンプレートエンジンとして 'jade' を使う設定

// ミドルウェアの設定(リクエストが来るたびに実行される処理)
app.use(logger('dev'));                          // 開発用モードでログを出力する設定
app.use(express.json());                         // JSON形式のリクエストボディを解析して使えるようにする
app.use(express.urlencoded({ extended: false }));// フォームから送信されたデータ(URLエンコードされたデータ)を解析する
app.use(cookieParser());                         // クッキーを解析して req.cookies で使えるようにする
app.use(express.static(path.join(__dirname, 'public'))); // 'public' フォルダを静的ファイル(画像やCSS)置き場として公開する

// ルーティングの設定(URLに応じた処理の振り分け)
app.use('/', indexRouter);      // 'http://localhost:3000/' にアクセスが来たら indexRouter に任せる
app.use('/users', usersRouter); // 'http://localhost:3000/users' にアクセスが来たら usersRouter に任せる

// 404エラーのハンドリング(どのルートにもマッチしなかった場合)
app.use(function(req, res, next) {
  next(createError(404)); // 404エラーオブジェクトを作って、次のエラー処理へ渡す
});

// エラーハンドラー(エラーが起きた時の最終的な処理)
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message; // 画面表示用にエラーメッセージをセット
  res.locals.error = req.app.get('env') === 'development' ? err : {}; // 開発環境なら詳細なエラー情報を、本番なら空情報をセット

  // render the error page
  res.status(err.status || 500); // ステータスコードを設定(なければ500)
  res.render('error');           // 'error.jade' テンプレートを使ってエラー画面を表示
});

module.exports = app; // 設定済みの app オブジェクトをエクスポート(wwwファイルで使うため)

www(binフォルダ内)

サーバーを実際に起動するための実行ファイルです。

#!/usr/bin/env node
// ↑ これはシェバンと言い、このファイルをnodeコマンドで実行することを指定しています。

/**
 * Module dependencies.
 */

var app = require('../app'); // 先ほど解説した app.js を読み込みます
var debug = require('debug')('hello-world:server'); // デバッグログツールを初期化
var http = require('http'); // Node.js標準のHTTPサーバーモジュールを読み込み

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000'); // ポート番号を決定(環境変数PORTがあればそれ、なければ3000番)
app.set('port', port); // Expressアプリにポート番号を設定

/**
 * Create HTTP server.
 */

var server = http.createServer(app); // Expressアプリを使ってHTTPサーバーを作成

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port); // 指定したポートでサーバーを待機状態(起動)にする
server.on('error', onError); // エラーが起きたら onError 関数を実行するよう登録
server.on('listening', onListening); // 起動が完了したら onListening 関数を実行するよう登録

/**
 * Normalize a port into a number, string, or false.
 * ポート番号が正しい形式かチェック・変換する関数
 */

function normalizePort(val) {
  var port = parseInt(val, 10); // 数値に変換

  if (isNaN(port)) {
    // named pipe (数値でなければパイプ名としてそのまま返す)
    return val;
  }

  if (port >= 0) {
    // port number (正の数ならポート番号として返す)
    return port;
  }

  return false; // それ以外は不正
}

/**
 * Event listener for HTTP server "error" event.
 * サーバーエラー発生時の処理
 */

function onError(error) {
  if (error.syscall !== 'listen') { // listen以外のエラーなら
    throw error; // そのままエラーを投げる
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // よくある特定のエラーに対する親切なメッセージ処理
  switch (error.code) {
    case 'EACCES': // 権限がない場合(例:低いポート番号を使おうとした)
      console.error(bind + ' requires elevated privileges');
      process.exit(1); // プログラム終了
      break;
    case 'EADDRINUSE': // すでにポートが使われている場合
      console.error(bind + ' is already in use');
      process.exit(1); // プログラム終了
      break;
    default:
      throw error; // その他のエラーはそのまま投げる
  }
}

/**
 * Event listener for HTTP server "listening" event.
 * サーバー起動成功時の処理
 */

function onListening() {
  var addr = server.address(); // サーバーのアドレス情報を取得
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind); // "Listening on port 3000" のようなログを出す
}

index.jade(views内)

トップページのHTMLテンプレートです。※.jadeはPug(HTMLを効率よくコーディングするためのテンプレートエンジン)を使っている。

extends layout        // layout.jade を継承します

block content         // layout.jade の content 部分に以下を埋め込みます
  h1= title           // 変数 title の内容を h1タグで表示
  p Welcome to #{title} // "Welcome to [titleの中身]" という段落を表示

error.jade(views内)

エラー画面のHTMLテンプレートです。

extends layout        // layout.jade の内容を継承(ベースにする)します

block content         // layout.jade 内の "block content" の部分を以下の内容で上書きします
  h1= message         // 変数 message の内容を h1タグとして表示
  h2= error.status    // 変数 error.status の内容を h2タグとして表示
  pre #{error.stack}  // 変数 error.stack(エラーの詳細ログ)を preタグで表示

layout.jade(views内)

全ページ共通の枠組み(ヘッダーなど)を定義するテンプレートです。

doctype html
html
  head
    title= title      // ページタイトルを変数 title から設定
    link(rel='stylesheet', href='/stylesheets/style.css') // CSSファイルを読み込み
  body
    block content     // ここに、継承した各ページ(index.jadeなど)の内容が差し込まれます

index.js(routesフォルダ内)

トップページ (/) へのアクセスを処理するファイルです。

var express = require('express');
var router = express.Router(); // ルーターオブジェクトを作成

/* GET home page. */
// '/' (ルート) に GETリクエストが来た時の処理
router.get('/', function(req, res, next) {
  // 'index' というテンプレート(index.jade)を使ってレスポンスを返す
  // その際、テンプレート内で使う title 変数に 'Express' という文字を渡す
  res.render('index', { title: 'Express' });
});

module.exports = router; // ルーターをエクスポート(app.jsで使うため)

users.js(routesフォルダ内)

ユーザーページ (/users) 関連のアクセスを処理するファイルです。app.js/users に割り当てられているため、ここの / は実際には http://localhost:3000/users/ を意味します。

var express = require('express');
var router = express.Router();

/* GET users listing. */
// '/users/' に GETリクエストが来た時の処理
router.get('/', function(req, res, next) {
  res.send('respond with a resource'); // 文字列をそのままレスポンスとして返す(画面表示)
});

module.exports = router;// ルーターをエクスポート(app.jsで使うため)

そして、「www」からコードを解説を見ながら辿ってみてください。

そうすると、徐々にやっている処理が見えてくるはずです。

これを元に、色々書き換えたりしてWebアプリ開発をしていくのが良いと思います

なるほど、色々分かってきました!

しかし、ここまでしなくても、index.jsと「views」フォルダさえあれば十分にWebアプリ開発は可能です!

Node.js Expreess ウェブアプリ開発の例

このように、「○○.js」にすべての処理を書き込むのも一応ありです。

しかし、特定の処理を探したりするのに時間がかかってしまうので、上のように色々ルーター等で分けた方が、効率が良いわけです。

加えて、静的フォルダだけというのもありです。
Node.jsをAPIサーバーとして利用する感じです。

なるほど、ブラウザのJSでサーバーに情報を取得・送信して色々する感じか。

最後に:まずは「改造」から始めてみよう!

最後まで読んでいただきありがとうございます! これであなたも、Node.jsとExpressを使った開発環境を構築できました!

「理屈はわかったけど、次は何をすればいいの?」 と思ったら、まずは今回作ったアプリの「改造」から始めてみましょう。

  1. views/index.jade の “Welcome to Express” を “Hello [自分の名前]” に変えてみる
  2. routes/index.js の処理を少し変更してみる
  3. public/stylesheets のCSSをいじって背景色を変えてみる
  4. 新たなルーターを作成して、ユーザー認証機能を作成してみる。

プログラミング上達の近道は、「壊れてもいいから、たくさん触って遊ぶこと」だと私は思います。

もしエラーが出ても、それは成長のチャンス。 ぜひExpressを使い倒して、Webアプリ開発を楽しんでください!

改めて、最後までご覧いただき有難うございました!
もし、トラブルがありましたら、お気軽にコメント欄で質問してください!

この記事は役に立ちましたか?

この記事を書いた人

コメントはこちらからどうぞ

コメントはこちらで承認の作業を行うまでは表示されません。ご了承ください。