Menu
CoddyTech

Jeden format błędu

Część sekcji API REST ścieżki Node.js w Coddy. Lekcja 12 z 25.

Twoje API zwraca teraz błędy w dwóch formatach: ciąg znaków dla błędu 404 i obiekt zod dla błędu 400. Klient musi obsłużyć każdy z nich. Wybierz jeden format dla wszystkich błędów:

{ "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 jest przeznaczone dla programów: nigdy się nie zmienia, więc klient może je porównywać. message jest przeznaczone dla ludzi, a jego treść może się zmieniać. fields wskazuje formularzowi, które pole oznaczyć. Zdefiniuj ten format w jednej funkcji i wywołuj ją w każdej trasie, aby format nie różnił się między trasami:

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

Wyzwanie

Łatwy

Twoje API wysyła teraz błędy w dwóch formatach: zwykły ciąg znaków dla 404 i obiekt zod dla 400. Nadaj wszystkim błędom ten sam format, aby klient mógł odczytywać je w ten sam sposób. Od teraz każdy błąd wygląda tak, a fields jest dodawane tylko wtedy, gdy jest coś do wymienienia:

{ "error": { "code": "not_found", "message": "Task not found" } }
  1. W errors.js dokończ sendError(res, status, code, message, fields). Funkcja odpowiada podanym statusem i używa formatu pokazanego powyżej. Dodaj fields do obiektu wewnętrznego tylko wtedy, gdy podano ten argument. sendInvalid, znajdująca się poniżej, jest już napisana i wywołuje twoją funkcję.
  2. W routes/tasks.js zaimportuj oba pomocniki:
    • Zastąp cztery odpowiedzi 404 (GET, PATCH, PUT i DELETE dla pojedynczego zadania) wywołaniem sendError, używając kodu not_found i komunikatu Task not found.
    • Zastąp trzy odpowiedzi 400 dla nieprawidłowej treści żądania (POST, PATCH i PUT) wywołaniem sendInvalid(res, result.error).

    Nieprawidłowa treść żądania wygląda wtedy tak (komunikat tworzy zod):

    {
      "error": {
        "code": "invalid_body",
        "message": "Invalid input: expected string, received number",
        "fields": { "title": ["Invalid input: expected string, received number"] }
      }
    }
  3. W server.js zaimportuj sendError i użyj go w procedurze obsługi błędów na dole pliku:
    • Nieprawidłowy format JSON w treści żądania skutkuje statusem 400, kodem invalid_json i komunikatem The body is not valid JSON.
    • Każdy inny błąd skutkuje statusem 500, kodem server_error i komunikatem Something went wrong.

Wypróbuj: DELETE /api/tasks/99 zwraca 404 z { "error": { "code": "not_found", "message": "Task not found" } } i bez fields. Wyślij POST z treścią { "title": 123 } do /api/tasks: otrzymasz 400 z opisanym powyżej błędem invalid_body. Pasek żądania nie pozwala wysłać nieprawidłowego JSON-a, więc testy sprawdzają za ciebie przypadek invalid_json.

Spróbuj swoich sił

import { z } from 'zod';

// Wysyła każdy błąd w jednolitym formacie:
// { "error": { "code": "not_found", "message": "Task not found" } }
// z "fields" dodawanym tylko wtedy, gdy zostało podane.
export const sendError = (res, status, code, message, fields) => {
    // Wyślij odpowiedź tutaj
};

// Błąd zod jako 400: pierwszy problem jako komunikat, a problemy każdego pola
// w fields.
export const sendInvalid = (res, zodError) =>
    sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji API REST

Poćwicz samodzielnie: Edytor online Express