Menu
CoddyTech

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');
challenge icon

Aufgabe

Einfach

Deine 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" } }
  1. Vervollständige in errors.js sendError(res, status, code, message, fields). Die Funktion antwortet mit dem angegebenen Status und der oben gezeigten Form. Füge fields nur dann zum inneren Objekt hinzu, wenn dieses Argument angegeben wurde. sendInvalid darunter ist bereits geschrieben und ruft deine Funktion auf.
  2. Importiere in routes/tasks.js beide Hilfsfunktionen:
    • Ersetze die vier 404-Antworten (GET, PATCH, PUT und DELETE für eine einzelne Aufgabe) durch sendError und verwende den Code not_found sowie die Meldung Task 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"] }
      }
    }
  3. Importiere in server.js sendError und verwende es im Fehler-Handler am Ende:
    • Ein Body, der kein gültiges JSON ist, erhält den Status 400, den Code invalid_json und die Meldung The body is not valid JSON.
    • Alles andere erhält den Status 500, den Code server_error und die Meldung Something went wrong.

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);
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in REST-APIs

Übe selbstständig: Express-Playground