2.

ExpressでHTTPサーバーを起動する手順|app.listenとnodemon

編集
この記事の要点
  • Express でサーバーを起動するには express() でアプリを作り、ルートを定義して app.listen(port) を呼ぶだけ
  • app.listen() は内部で Node 標準の http.createServer() を呼んでおり、戻り値は HTTP サーバオブジェクト
  • 開発時はファイル変更で自動再起動する nodemon を使うと反復が速い
  • ポート番号は環境変数 PORT を尊重するのが定番(PaaS / Docker で必須)
  • EADDRINUSE(ポート使用中)は最頻出エラー。プロセス確認と kill でリリース

前提

本記事は Node.jsExpress の最小構成で HTTP サーバを立ち上げる手順をまとめます。Node.js(および npm)はインストール済みとします。Express 単体の概念は Express 側で扱っているので、ここでは「動かす」ことに集中します。

1. プロジェクトの初期化と Express のインストール

mkdir my-express-app && cd my-express-app

# package.json を生成(質問は全部 Enter で OK)
npm init -y

# Express を依存に追加
npm install express

これで node_modulespackage.jsonexpress が登録されます。

2. 最小サーバスクリプト(server.js)

/ にアクセスすると Express!! と返す」だけの最小構成です。CommonJS 版(require)から見ていきます。

// server.js (CommonJS)
const express = require('express');

const app = express();
const PORT = process.env.PORT || 8000;

// ルーティング: GET /
app.get('/', (req, res) => {
  res.send('Express!!');
});

// サーバ起動
app.listen(PORT, () => {
  console.log(`サーバ起動中: http://localhost:${PORT}/`);
});

ESM(import)派の場合は package.json"type": "module" を追記したうえで、次のように書きます。

// server.js (ESM)
import express from 'express';

const app = express();
const PORT = process.env.PORT || 8000;

app.get('/', (req, res) => {
  res.send('Express!!');
});

app.listen(PORT, () => {
  console.log(`サーバ起動中: http://localhost:${PORT}/`);
});

3. 起動

node server.js

コンソールに サーバ起動中: http://localhost:8000/ と出れば成功です。ブラウザで http://localhost:8000/ を開くと、画面に Express!! と表示されます。

4. ルートを増やす(基本のルーティング)

ルーティングはメソッド名のメソッド(app.get / app.post / ...)に「パス」と「コールバック」を渡すだけで定義できます。

app.get('/health', (req, res) => res.json({ status: 'ok' }));

app.get('/users/:id', (req, res) => {
  res.json({ id: req.params.id, name: 'sample' });
});

app.post('/echo', express.json(), (req, res) => {
  res.json({ received: req.body });
});

express.json()Content-Type: application/json のリクエストボディを req.body に展開するビルトインミドルウェアです。POST 受け取りでは必須なので忘れずに。

5. 開発時の自動再起動(nodemon)

node server.js はソース変更時に手動で再起動しないと反映されません。開発中は nodemon を使うとファイル変更で自動再起動してくれます。

# 開発依存に追加
npm install --save-dev nodemon

# 起動
npx nodemon server.js

package.jsonscripts に登録しておくとチームでも揃えやすくなります。

{
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  }
}

6. ポート番号と環境変数

ポート番号 は次の優先度で決めるのが定番です。

  1. 環境変数 PORT がセットされていればそれを使う(Heroku / Cloud Run など PaaS の前提)
  2. 無ければ開発用の固定値(8000 / 3000)にフォールバック
const PORT = Number(process.env.PORT) || 8000;

ローカルでも環境変数を切り替えたい場合は dotenv パッケージで .env 読み込みを使うと管理しやすくなります。

7. 終了時の後片付け(Graceful Shutdown)

本番運用するなら、SIGTERM を受け取って既存リクエスト処理を完了してから終了する処理を入れておくべきです。コンテナ環境では特に重要になります。

const server = app.listen(PORT, () => {
  console.log(`listening on ${PORT}`);
});

const shutdown = () => {
  console.log('shutting down...');
  server.close(() => {
    console.log('http server closed');
    process.exit(0);
  });
};

process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);

よくあるエラーと対処

エラー原因 / 対処
Error: listen EADDRINUSE :::8000同じポートを別プロセスが既に使っている。lsof -i :8000(macOS/Linux)/ netstat -ano | findstr :8000(Windows)で PID を確認し、kill / taskkill でリリース
Cannot find module 'express'npm install 忘れ、または別フォルダで実行している
SyntaxError: Unexpected token importESM 構文を CommonJS モードで実行している。package.json"type": "module" を追加するか require 版に書き換え
req.bodyundefinedPOST で JSON を受けるのに express.json() を入れていない
CORS で弾かれる別オリジンの API として呼ぶ場合は cors パッケージを app.use(cors()) で導入

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法
  2. サーバーの起動

最近更新/作成されたページ