1. 普通のパスはそのまま動く
  2. 投げられたエラーは500で受け止める
  3. 非同期の失敗も受け皿へ回る
コース一覧
Node.js入門
エラーハンドリング

Node.js入門

Node.jsの実行モデル、npm、Expressによるルーティング、REST API設計、データベース接続、トランザクションを使った購入処理、トークン認証まで、バックエンド開発の基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIを自分の手で作りながら学びます。

1
Node.jsとは
01. Node.jsとは15分
02. スクリプトを実行する15分
03. npmとは15分
04. package.json15分
05. npmスクリプト15分
06. つくる:プロジェクト始動20分
07. 第1章クイズ10分
2
モジュールと非同期の復習
01. import/export15分
02. ファイルを読み書きする15分
03. async/await復習15分
04. JSONの取り回し15分
05. つくる:データ層20分
06. 第2章クイズ10分
3
はじめてのサーバー
01. サーバーとリクエスト15分
02. Expressを導入する15分
03. ルーティング15分
04. JSONを返す15分
05. 開発の回し方15分
06. つくる:サーバー始動20分
07. 第3章クイズ10分
4
REST APIのきほん
01. RESTの考え方15分
02. 一覧を返す15分
03. 1件を返す15分
04. 登録を受ける15分
05. 更新と削除15分
06. ステータスコード15分
07. つくる:商品CRUD完成20分
08. 第4章クイズ10分
5
リクエスト処理と検証
01. クエリパラメータ15分
02. 並び替えとページング15分
03. 入力検証15分
04. ミドルウェア15分
05. エラーハンドリング15分
06. つくる:検索API完成20分
07. 第5章クイズ10分
6
データベース接続
01. DBにつなぐ15分
02. 一覧・詳細をDB化15分
03. 出品をDB化15分
04. SQLインジェクション20分
05. 更新・削除をDB化15分
06. 購入トランザクション20分
07. つくる:DB版fleama20分
08. 第6章クイズ10分
7
認証のきほん
01. 認証と認可15分
02. パスワードハッシュ15分
03. ログインとトークン15分
04. 保護ルート15分
05. 本人のものだけ15分
06. つくる:認証完備20分
07. 第7章クイズ10分
8
総合制作
01. fleama API完成20分
02. Reactと接続する20分
03. サーバーで常駐させる20分
04. 自由拡張20分
05. 完成と次のステップ15分

エラーハンドリング

想定していない失敗は必ず起きる

第5章の入力検証で、おかしな入力は 400 で弾けるようになりました。ですが世の中には、こちらが想定していなかった失敗があります。

ファイルが壊れていた。データベースが一瞬つながらなかった。書いたコードに勘違いがあった。

こうした失敗は、エラーとして投げられます。そのまま放っておくと、応答が返らないままリクエストが終わります。受け取る側から見ると、ただ固まったように見えます。

エラー用のミドルウェア

Express には、エラーを受け止める専用のミドルウェアがあります。

JavaScript

app.use((err, req, res, next) => { res.status(500).json({ error: "サーバーで問題が起きました" }); });

引数が 4 つあるのが目印です。前のレッスンのミドルウェアは 3 つでした。この 1 つの違いで、Express はエラー用だと見分けます。省略できません。

置く場所は一番下

エラー用のミドルウェアは、すべてのルートより後に書きます。

JavaScript

app.get("/items", ...); app.post("/items", ...); app.use((err, req, res, next) => { ... }); // 最後

リクエストは上から順に通るので、途中に置くとその下のルートのエラーを拾えません。最後の受け皿として置きます。

中身をそのまま返さない

エラーには、内部の情報が入っていることがあります。

JavaScript

res.status(500).json({ error: err.message }); // 避けたい

ファイルの場所やデータベースの構造が、そのまま外に出るかもしれません。攻撃の手がかりになります。

外には決まった文言を返し、詳しい中身は自分の記録に残します。

JavaScript

app.use((err, req, res, next) => { console.error(err); res.status(500).json({ error: "サーバーで問題が起きました" }); });

非同期の失敗は自分で渡す

async を付けた関数の中で起きたエラーは、自動では拾われません。

JavaScript

app.get("/items", async (req, res, next) => { try { const items = await readItems(); res.json(items); } catch (error) { next(error); } });

next にエラーを渡して呼ぶと、エラー用のミドルウェアへ回されます。引数なしの next() が「次へ進む」なのに対し、next(error) は「失敗したので受け皿へ」という意味になります。

手を動かす

演習では、落ちないAPIを作ります。エラーを受け止める最後の受け皿を用意してください。

要件

  1. すべてのルートより後に、引数 4 つのエラー用ミドルウェアを置く
  2. 500 で {"error":"サーバーで問題が起きました"} を返し、エラーの中身は外に出さない
  3. /async-boom は try と catch で受けて next(error) へ渡す

入出力例

request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー"}]" request("GET", "/boom") → "500 {"error":"サーバーで問題が起きました"}" request("GET", "/async-boom") → "500 {"error":"サーバーで問題が起きました"}"

ヒント

エラー用のミドルウェアは引数が 4 つです。3 つだと普通のミドルウェアとして扱われます

置く場所はすべてのルートより後、`return app;` の直前です

`/async-boom` は `try` で囲んで、`catch (error)` の中から `next(error)` を呼びます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • つくる:検索API完成

    検索と検証を備え、フリマらしい絞り込みを完成できるようになります。

  • 第5章クイズ

    リクエスト処理と検証の理解を4択で確認します。

  • DBにつなぐ

    接続して1行取り出すところまで確かめ、NodeからSQLを発行できるようになります。

  • 認証と認可

    未ログインで出品APIを叩いて課題を確かめ、認証と認可を区別できるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • データベースデータを構造化して保存する仕組み
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • ミドルウェアリクエストとレスポンスの間に挟まる処理関数。
  • 引数位置引数=順番で渡す。
  • 非同期完了を待たずに次へ進み、後で結果を受ける
  • 同期処理が終わるまで次に進まない実行順
  • 関数処理に名前を付けて再利用できる単位
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
main.js
学習モード
エディタを読み込んでいます

メモ

エラーハンドリング

⌘S で保存