Menu
CoddyTech

統一されたエラー形式

CoddyのNode.jsジャーニー「REST API」セクションの一部。レッスン 8/18。

API のエラー応答は、404 では文字列、400 では zod のオブジェクトという 2 つの形式になっています。クライアントはそれぞれに対応する必要があります。すべてのエラーで、形式を 1 つに統一しましょう。

{ "error": { "code": "not_found", "message": "Invoice not found" } }

{ "error": { "code": "invalid_body", "message": "Too small: ...",
             "fields": { "amount": ["Too small: expected number to be >0"] } } }

code はプログラム向けです。変わることがないため、クライアントはその値を比較できます。message は人向けで、文言が変わることがあります。fields は、フォームでどの入力欄を強調表示するかを示します。形式を 1 つの関数に記述し、すべてのルートから呼び出すことで、ルートごとに形式が食い違わないようにしましょう。

sendError(res, 404, 'not_found', 'Invoice not found');
challenge icon

チャレンジ

簡単
  • errors.jsにsendErrorを書きます。ステータスと、指定された場合に限りfieldsを含めます:{ "error": { "code", "message" } }。
  • すべての404でこれを使い(コードはnot_found)、不正なリクエストボディにはすべてsendInvalidを使い、server.jsのエラーハンドラーではsendErrorを使います(invalid_json、server_error)。

DELETE /api/tasks/99を送信し、次に{ "title": 123 }を使ってPOSTします。

自分で試してみよう

import { z } from 'zod';

// すべてのエラーを次の形式で送信する:
// { "error": { "code": "not_found", "message": "Task not found" } }
// "fields" は指定された場合にのみ追加する。
export const sendError = (res, status, code, message, fields) => {
    // ここでレスポンスを送信する
};

// zod のエラーを 400 として送信する: 最初の問題をメッセージとし、各フィールドの
// 問題を fields に格納する。
export const sendInvalid = (res, zodError) =>
    sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

REST APIのすべてのレッスン