統一されたエラー形式
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');チャレンジ
簡単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);
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。