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');Sfida
FacileOra 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" } }- In
errors.js, completasendError(res, status, code, message, fields). Risponde con lo status specificato e il formato qui sopra. Aggiungifieldsall'oggetto interno solo se quell'argomento è stato fornito.sendInvalid, più sotto, è già scritto e chiama la tua funzione. - 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 codicenot_founde il messaggioTask 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"] } } } - Sostituisci le quattro risposte 404 (GET, PATCH, PUT e DELETE per una singola attività) con
- In
server.js, importasendErrore usalo nel gestore degli errori in fondo:- Un corpo che non è JSON valido riceve lo status 400, il codice
invalid_jsone il messaggioThe body is not valid JSON. - Tutto il resto riceve lo status 500, il codice
server_errore il messaggioSomething went wrong.
- Un corpo che non è JSON valido riceve lo status 400, il codice
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);
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di API REST
1Risorse e verbi
Risorse e URLCreare con POST4Browser, versioni e configurazione
Che cos'è un'origineConsentire un'altra origineCORSUna pagina che chiama l'API2Validazione ed errori
Convalidare l'inputEsercitati da solo: Playground Express