Menu
CoddyTech

Un único formato de error

Parte de la sección API REST del Journey de Node.js de Coddy. Lección 8 de 18.

Tu API responde ahora a los errores con dos formatos: una cadena para un 404 y el objeto de zod para un 400. Un cliente tiene que gestionar cada uno. Elige un formato para todos los errores:

{ "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 es para los programas: nunca cambia, así que un cliente puede compararlo. message es para las personas, y su redacción puede cambiar. fields indica a un formulario qué entrada marcar. Define el formato en una función y llámala desde todas las rutas, para que ningún formato de ruta se desvíe:

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

Desafío

Fácil
  • Escribe sendError en errors.js: { "error": { "code", "message" } } con el estado, además de fields solo cuando se proporcione.
  • Úsalo para cada 404 (código not_found), sendInvalid para cada cuerpo no válido y sendError en el controlador de errores de server.js (invalid_json, server_error).

Envía DELETE /api/tasks/99, después haz un POST con { "title": 123 }.

Pruébalo tú mismo

import { z } from 'zod';

// Envía todos los errores con la misma estructura:
// { "error": { "code": "not_found", "message": "Task not found" } }
// con "fields" añadido solo cuando se proporciona.
export const sendError = (res, status, code, message, fields) => {
    // Envía la respuesta aquí
};

// Un error de zod como un 400: su primer problema como mensaje y los problemas de cada campo
// en fields.
export const sendInvalid = (res, zodError) =>
    sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de API REST