Menu
CoddyTech

Un'unica struttura per gli errori

Fa parte della sezione API REST del percorso Node.js di Coddy. Lezione 12 di 25.

La tua API ora restituisce gli errori in due formati: una stringa per un 404 e l’oggetto di zod per un 400. Un client deve gestirli entrambi. Scegli un unico formato per tutti gli errori:

{ "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 è destinato ai programmi: non cambia mai, quindi un client può confrontarlo. message è destinato alle persone e la sua formulazione può cambiare. fields indica a un modulo quale campo contrassegnare. Definisci il formato in un’unica funzione e chiamala da ogni route, così nessuna route potrà discostarsene:

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

Sfida

Facile

Ora la tua API invia gli errori in due formati: una semplice stringa per un 404 e l'oggetto di zod per un 400. Dai a ogni errore lo stesso formato, così un client può leggerli tutti allo stesso modo. D'ora in poi ogni errore avrà questo aspetto, con fields aggiunto solo quando c'è qualcosa da elencare:

{ "error": { "code": "not_found", "message": "Task not found" } }
  1. In errors.js, completa sendError(res, status, code, message, fields). Risponde con lo status specificato e il formato qui sopra. Aggiungi fields all'oggetto interno solo se quell'argomento è stato fornito. sendInvalid, più sotto, è già scritto e chiama la tua funzione.
  2. In routes/tasks.js, importa entrambi gli helper:
    • Sostituisci le quattro risposte 404 (GET, PATCH, PUT e DELETE per una singola attività) con sendError, usando il codice not_found e il messaggio Task not found.
    • Sostituisci le tre risposte 400 per un corpo non valido (POST, PATCH e PUT) con sendInvalid(res, result.error).

    Un corpo non valido apparirà così (zod scrive il messaggio):

    {
      "error": {
        "code": "invalid_body",
        "message": "Invalid input: expected string, received number",
        "fields": { "title": ["Invalid input: expected string, received number"] }
      }
    }
  3. In server.js, importa sendError e usalo nel gestore degli errori in fondo:
    • Un corpo che non è JSON valido riceve lo status 400, il codice invalid_json e il messaggio The body is not valid JSON.
    • Tutto il resto riceve lo status 500, il codice server_error e il messaggio Something went wrong.

Prova: DELETE /api/tasks/99 restituisce 404 con { "error": { "code": "not_found", "message": "Task not found" } }, senza fields. Invia { "title": 123 } con POST a /api/tasks: ricevi 400 con l'errore invalid_body qui sopra. La barra delle richieste rifiuta di inviare JSON non valido, quindi i test verificano per te il caso invalid_json.

Provalo tu

import { z } from 'zod';

// Invia tutti gli errori nello stesso formato:
// { "error": { "code": "not_found", "message": "Task not found" } }
// con "fields" aggiunto solo se fornito.
export const sendError = (res, status, code, message, fields) => {
    // Invia la risposta qui
};

// Un errore zod come risposta 400: il primo problema come messaggio, i problemi di ciascun campo
// in fields.
export const sendInvalid = (res, zodError) =>
    sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di API REST

Esercitati da solo: Playground Express