コース一覧
    Node.jsバックエンド実践
    エラーハンドリング

    Node.jsバックエンド実践

    入力検証、ミドルウェア、エラー処理、データベース接続を学び、実用的なバックエンドAPIを安全に組み立てられるようにします。

    1
    リクエスト処理と検証
    01. クエリパラメータ15分
    02. 並び替えとページング15分
    03. 入力検証15分
    04. ミドルウェア15分
    05. エラーハンドリング15分
    06. つくる:検索API完成20分
    07. 第5章クイズ10分
    2
    データベース接続
    01. DBにつなぐ15分
    02. 一覧・詳細をDB化15分
    03. 出品をDB化15分
    04. SQLインジェクション20分
    05. 更新・削除をDB化15分
    06. 購入トランザクション20分
    07. つくる:DB版fleama20分
    08. 第6章クイズ10分

    エラーハンドリング

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

    第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) へ渡す

    ヒント

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

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

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

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

    関連レッスン

    • つくる:検索API完成

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

    • 第5章クイズ

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

    • DBにつなぐ

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

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

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

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

    メモ

    エラーハンドリング

    ⌘S で保存