Probando nuestros endpoints

Clase 21 de 27Curso de Backend con Node.js: API REST con Express.js

Resumen

¿Cómo integras los middlewares de validación en los endpoints?

El uso de middlewares de validación es fundamental para asegurar la integridad y consistencia de los datos en nuestras aplicaciones. Ya hemos creado toda la estructura de nuestros middlewares usando Joy. Ahora, es momento de ver cómo los aplicamos en cada uno de nuestros endpoints de manera eficiente.

Primero, es crucial recordar que hemos creado una función denominada ValidatorHandler. Esta es esencialmente una función que retorna otra función (gracias a los closures de JavaScript) y permite la creación de un middleware de forma dinámica. Al utilizar ValidatorHandler, enviamos un esquema y especificamos la propiedad que contiene la información necesaria para validar los datos.

¿Cómo importar y preparar los esquemas?

Lo primero que debemos hacer es importar nuestra función ValidatorHandler y los esquemas necesarios en nuestras rutas. Esto es esencial ya que las rutas son las que manejan el request y el response, y es aquí donde configuraremos qué esquema usar para cada endpoint.

const {ValidatorHandler} = require('middlewares');
const {createProductSchema, updateProductSchema, getProductSchema} = require('schemas');

¿Cómo aplicar middlewares a las rutas?

Cada endpoint debe ejecutar y definir su propio esquema. El middleware se ejecutará en la ruta, acompañando a otros middlewares o procesos que cada endpoint tenga configurado. Esto asegura que la validación se realice justo antes de que el servicio se ejecute.

Por ejemplo, en un endpoint que recibe un ID como parámetro, debemos estar seguros que dicho ID cumpla con el formato esperado. Así lo aplicamos:

router.get('/products/:id',
  ValidatorHandler(getProductSchema, 'params'),
  (req, res) => {
    res.json({
      message: 'Producto obtenido satisfactoriamente'
    });
  }
);

¿Cómo gestionar validaciones múltiples?

En algunos casos, una ruta necesita múltiples validaciones. Por ejemplo, un endpoint que requiere validar tanto parámetros del body como de la URL. Los middlewares se ejecutan de forma secuencial, por lo que podemos encadenarlos para verificar cada parte de los datos:

router.patch('/products/:id',
  ValidatorHandler(getProductSchema, 'params'),
  ValidatorHandler(updateProductSchema, 'body'),
  (req, res) => {
    res.json({
      message: 'Producto actualizado satisfactoriamente'
    });
  }
);

¿Cómo manejar errores de validación con Joy?

Cuando ocurre un error de validación, es importante brindar una respuesta clara y específica. Joy detecta errores y retorna un código HTTP 400 (Bad Request) si la validación falla. Inicialmente, Joy solo devuelve el primer error que encuentra. Sin embargo, podemos configurar Joy para que reporte todos los errores a la vez utilizando la opción abortEarly: false.

const options = { abortEarly: false };
return schema.validate(data, options);

Con este ajuste, el usuario recibe todos los errores de validación de una vez, mejorando la experiencia del desarrollador y del usuario final.

¿Qué funciones básicas se deben cuidar en los esquemas?

  1. Especificidad de campos: Define claramente campos obligatorios y sus tipos, como un string o número.

  2. Restricciones de valores: Establece límites o reglas, como la longitud mínima y máxima, o tipo de dato específico (por ejemplo, alfanumérico).

  3. Requerimiento de campos: Determina si un campo es obligatorio usando required.

  4. URLs válidas: Define un campo como URL, si es necesario.

Este enfoque no solo optimiza la integridad de los datos al interactuar con nuestros servicios, sino que también mejora la estructura y mantenibilidad del código. Al integrar middlewares de validación en cada ruta, aseguramos que las solicitudes no válidas nunca lleguen a los servicios en producción, mejorando así la robustez de nuestro sistema.