Un único formato de error
Parte de la sección API REST del Journey de Node.js de Coddy. Lección 12 de 25.
Tu API ahora responde 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 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é campo marcar. Define el formato en una función y llámala desde cada ruta para que ninguna ruta se desvíe:
sendError(res, 404, 'not_found', 'Invoice not found');Desafío
FácilTu API ahora envía los errores de dos formas: una cadena simple para un 404 y el objeto de zod para un 400. Da a todos los errores la misma forma para que un cliente pueda leerlos todos de la misma manera. A partir de ahora, todos los errores tienen este aspecto, con fields añadido solo cuando hay algo que enumerar:
{ "error": { "code": "not_found", "message": "Task not found" } }- En
errors.js, terminasendError(res, status, code, message, fields). Responde con el estado indicado y la forma anterior. Añadefieldsal objeto interno solo cuando se haya proporcionado ese argumento.sendInvalid, que aparece debajo, ya está escrito y llama a tu función. - En
routes/tasks.js, importa ambos auxiliares:- Sustituye las cuatro respuestas 404 (GET, PATCH, PUT y DELETE para una tarea) por
sendError, usando el códigonot_foundy el mensajeTask not found. - Sustituye las tres respuestas 400 para un cuerpo no válido (POST, PATCH y PUT) por
sendInvalid(res, result.error).
Un cuerpo no válido se ve así (zod escribe el mensaje):
{ "error": { "code": "invalid_body", "message": "Invalid input: expected string, received number", "fields": { "title": ["Invalid input: expected string, received number"] } } } - Sustituye las cuatro respuestas 404 (GET, PATCH, PUT y DELETE para una tarea) por
- En
server.js, importasendErrory úsalo en el manejador de errores al final:- Un cuerpo que no sea JSON válido recibe el estado 400, el código
invalid_jsony el mensajeThe body is not valid JSON. - Cualquier otra cosa recibe el estado 500, el código
server_errory el mensajeSomething went wrong.
- Un cuerpo que no sea JSON válido recibe el estado 400, el código
Pruébalo: DELETE /api/tasks/99 devuelve 404 con { "error": { "code": "not_found", "message": "Task not found" } }, y sin fields. Envía por POST { "title": 123 } a /api/tasks: recibes un 400 con el error invalid_body anterior. La barra de solicitudes se niega a enviar JSON mal formado, así que las comprobaciones prueban por ti el caso invalid_json.
Pruébalo tú mismo
import { z } from 'zod';
// Envía todos los errores con el mismo formato:
// { "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, 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);
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de API REST
1Recursos y verbos
Recursos y URLCrear con POST4Navegadores, versiones y configuración
Qué es un origenPermitir otro origenCORSUna página que llama a la API2Validación y errores
Validar la entradaPractica por tu cuenta: Playground de Express