Menu
CoddyTech

하나의 오류 형식

Coddy Node.js 여정의 REST API 섹션에 포함된 레슨. 25개 중 12번째.

이제 API는 오류에 대해 두 가지 형식으로 응답합니다. 404에는 문자열을, 400에는 zod의 객체를 사용합니다. 클라이언트는 각각을 처리해야 합니다. 모든 오류에 하나의 형식을 선택하세요:

{ "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는 어떤 입력란을 표시할지 양식에 알려줍니다. 한 함수에 형식을 작성하고 모든 경로에서 호출하여, 경로마다 형식이 달라지지 않게 하세요:

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

챌린지

쉬움

이제 API는 두 가지 형태로 오류를 보냅니다. 404에는 일반 문자열을, 400에는 zod의 객체를 사용합니다. 모든 오류의 형태를 통일해 클라이언트가 같은 방식으로 읽을 수 있도록 하세요. 이제부터 모든 오류는 다음과 같은 형태이며, 나열할 항목이 있을 때만 fields가 추가됩니다.

{ "error": { "code": "not_found", "message": "Task not found" } }
  1. errors.js에서 sendError(res, status, code, message, fields)를 완성하세요. 전달된 상태 코드와 위 형태로 응답합니다. 해당 인수가 전달된 경우에만 내부 객체에 fields를 추가하세요. 그 아래의 sendInvalid는 이미 작성되어 있으며, 여러분의 함수를 호출합니다.
  2. routes/tasks.js에서 두 헬퍼를 모두 가져오세요.
    • 작업 하나에 대한 네 가지 404 응답(GET, PATCH, PUT, DELETE)을 sendError로 바꾸고, 코드는 not_found, 메시지는 Task not found를 사용하세요.
    • 잘못된 본문에 대한 세 가지 400 응답(POST, PATCH, PUT)을 sendInvalid(res, result.error)로 바꾸세요.

    잘못된 본문은 다음과 같은 형태가 됩니다(zod가 메시지를 작성합니다).

    {
      "error": {
        "code": "invalid_body",
        "message": "Invalid input: expected string, received number",
        "fields": { "title": ["Invalid input: expected string, received number"] }
      }
    }
  3. server.js에서 sendError를 가져와 아래쪽의 오류 처리기에서 사용하세요.
    • 유효한 JSON이 아닌 본문은 상태 코드 400, 코드 invalid_json, 메시지 The body is not valid JSON으로 처리합니다.
    • 그 외의 경우는 상태 코드 500, 코드 server_error, 메시지 Something went wrong로 처리합니다.

직접 해 보기: DELETE /api/tasks/99는 404와 함께 { "error": { "code": "not_found", "message": "Task not found" } }를 반환하며, fields는 포함하지 않습니다. { "title": 123 }을 /api/tasks에 POST하면 위의 invalid_body 오류와 함께 400을 받습니다. 요청 표시줄에서는 올바르지 않은 JSON을 보낼 수 없으므로, 검사에서 invalid_json 사례를 대신 테스트합니다.

직접 해보기

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의 모든 레슨

직접 연습해 보세요: Express 플레이그라운드