Einheitliches Fehlerformat
Teil des Abschnitts REST-APIs der Node.js-Journey von Coddy. Lektion 12 von 25.
Ihre API gibt Fehler jetzt in zwei Formen zurück: als Zeichenfolge bei einem 404 und als Objekt von zod bei einem 400. Ein Client muss beide Formen verarbeiten. Verwende für jeden Fehler dieselbe Form:
{ "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 ist für Programme gedacht: Es ändert sich nie, sodass ein Client es vergleichen kann. message ist für Menschen gedacht, und sein Wortlaut kann sich ändern. fields gibt einem Formular an, welche Eingabe markiert werden soll. Definiere die Form in einer Funktion und rufe sie in jeder Route auf, damit keine Route davon abweichen kann:
sendError(res, 404, 'not_found', 'Invoice not found');Aufgabe
EinfachDeine API sendet Fehler jetzt in zwei Formen: als einfache Zeichenfolge für einen 404-Fehler und als zod-Objekt für einen 400-Fehler. Gib allen Fehlern dieselbe Form, damit ein Client sie alle auf dieselbe Weise lesen kann. Ab jetzt sieht jeder Fehler so aus, wobei fields nur hinzugefügt wird, wenn es etwas aufzulisten gibt:
{ "error": { "code": "not_found", "message": "Task not found" } }- Vervollständige in
errors.jssendError(res, status, code, message, fields). Die Funktion antwortet mit dem angegebenen Status und der oben gezeigten Form. Fügefieldsnur dann zum inneren Objekt hinzu, wenn dieses Argument angegeben wurde.sendInvaliddarunter ist bereits geschrieben und ruft deine Funktion auf. - Importiere in
routes/tasks.jsbeide Hilfsfunktionen:- Ersetze die vier 404-Antworten (GET, PATCH, PUT und DELETE für eine einzelne Aufgabe) durch
sendErrorund verwende den Codenot_foundsowie die MeldungTask not found. - Ersetze die drei 400-Antworten für einen fehlerhaften Body (POST, PATCH und PUT) durch
sendInvalid(res, result.error).
Ein fehlerhafter Body sieht dann so aus (zod schreibt die Meldung):
{ "error": { "code": "invalid_body", "message": "Invalid input: expected string, received number", "fields": { "title": ["Invalid input: expected string, received number"] } } } - Ersetze die vier 404-Antworten (GET, PATCH, PUT und DELETE für eine einzelne Aufgabe) durch
- Importiere in
server.jssendErrorund verwende es im Fehler-Handler am Ende:- Ein Body, der kein gültiges JSON ist, erhält den Status 400, den Code
invalid_jsonund die MeldungThe body is not valid JSON. - Alles andere erhält den Status 500, den Code
server_errorund die MeldungSomething went wrong.
- Ein Body, der kein gültiges JSON ist, erhält den Status 400, den Code
Probiere es aus: DELETE /api/tasks/99 gibt den Status 404 mit { "error": { "code": "not_found", "message": "Task not found" } } zurück, ohne fields. Sende per POST { "title": 123 } an /api/tasks: Du erhältst den Status 400 mit dem obigen Fehler invalid_body. Die Anfrageleiste weigert sich, fehlerhaftes JSON zu senden, daher testen die Prüfungen den Fall invalid_json für dich.
Probier es selbst
import { z } from 'zod';
// Sendet jeden Fehler im gleichen Format:
// { "error": { "code": "not_found", "message": "Task not found" } }
// wobei "fields" nur hinzugefügt wird, wenn es angegeben ist.
export const sendError = (res, status, code, message, fields) => {
// Sende die Antwort hier
};
// Ein zod-Fehler als 400: das erste Problem als Nachricht, die Probleme jedes Feldes
// in fields.
export const sendInvalid = (res, zodError) =>
sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in REST-APIs
1Ressourcen und Verben
Ressourcen und URLsErstellen mit POST4Browser, Versionen und Konfiguration
Was ist ein Origin?Einen anderen Origin zulassenCORSEine Seite, die die API aufruft2Validierung und Fehler
Eingaben validierenÜbe selbstständig: Express-Playground