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');Wyzwanie
ŁatwyTwoje 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" } }- W
errors.jsdokończsendError(res, status, code, message, fields). Funkcja odpowiada podanym statusem i używa formatu pokazanego powyżej. Dodajfieldsdo obiektu wewnętrznego tylko wtedy, gdy podano ten argument.sendInvalid, znajdująca się poniżej, jest już napisana i wywołuje twoją funkcję. - W
routes/tasks.jszaimportuj oba pomocniki:- Zastąp cztery odpowiedzi 404 (GET, PATCH, PUT i DELETE dla pojedynczego zadania) wywołaniem
sendError, używając kodunot_foundi komunikatuTask 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"] } } } - Zastąp cztery odpowiedzi 404 (GET, PATCH, PUT i DELETE dla pojedynczego zadania) wywołaniem
- W
server.jszaimportujsendErrori 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_jsoni komunikatemThe body is not valid JSON. - Każdy inny błąd skutkuje statusem 500, kodem
server_errori komunikatemSomething went wrong.
- Nieprawidłowy format JSON w treści żądania skutkuje statusem 400, kodem
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);
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji API REST
1Zasoby i czasowniki
Zasoby i URL-eTworzenie za pomocą POST4Przeglądarki, wersje i konfiguracja
Czym jest originZezwalanie na dostęp z innego originCORSStrona wywołująca APIPoćwicz samodzielnie: Edytor online Express