50% OFF Plus
--:--:--
¡Obtener!

Validación de datos

Intermedio
Express
Express
Actualizado: 20/06/2025

¡Desbloquea el curso de Express completo!

IA
Ejercicios
Certificado
Entrar

Mira la lección en vídeo

Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.

Desbloquear Plan Plus

Validación de entrada

La validación de entrada es un proceso fundamental que garantiza que los datos recibidos en nuestras rutas cumplan con los criterios esperados antes de ser procesados. En Express, podemos implementar validación directamente en nuestros controladores utilizando las capacidades nativas del framework y JavaScript.

Validación básica de parámetros

Express proporciona acceso directo a los datos de entrada a través de los objetos req.params, req.query y req.body. La validación manual nos permite verificar estos datos antes de continuar con la lógica de negocio:

app.get('/usuarios/:id', (req, res) => {
  const { id } = req.params;
  
  // Validar que el ID sea un número
  if (!id || isNaN(parseInt(id))) {
    return res.status(400).json({
      error: 'El ID debe ser un número válido'
    });
  }
  
  // Validar rango del ID
  const userId = parseInt(id);
  if (userId <= 0) {
    return res.status(400).json({
      error: 'El ID debe ser mayor que 0'
    });
  }
  
  // Continuar con la lógica
  res.json({ mensaje: `Usuario ${userId} encontrado` });
});

Validación de datos del cuerpo de la petición

Para validar datos enviados en el cuerpo de las peticiones POST o PUT, podemos crear funciones de validación específicas que verifiquen la estructura y contenido:

app.post('/usuarios', (req, res) => {
  const { nombre, email, edad } = req.body;
  
  // Validar campos requeridos
  if (!nombre || !email) {
    return res.status(400).json({
      error: 'Nombre y email son campos obligatorios'
    });
  }
  
  // Validar formato de email
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  if (!emailRegex.test(email)) {
    return res.status(400).json({
      error: 'El formato del email no es válido'
    });
  }
  
  // Validar edad si se proporciona
  if (edad !== undefined) {
    if (isNaN(parseInt(edad)) || parseInt(edad) < 0 || parseInt(edad) > 120) {
      return res.status(400).json({
        error: 'La edad debe ser un número entre 0 y 120'
      });
    }
  }
  
  // Procesar datos válidos
  res.status(201).json({
    mensaje: 'Usuario creado correctamente',
    usuario: { nombre, email, edad }
  });
});

Validación de parámetros de consulta

Los query parameters también requieren validación, especialmente cuando se utilizan para filtrado o paginación:

app.get('/productos', (req, res) => {
  const { categoria, precio_min, precio_max, limite } = req.query;
  
  // Validar categoría si se proporciona
  if (categoria && typeof categoria !== 'string') {
    return res.status(400).json({
      error: 'La categoría debe ser una cadena de texto'
    });
  }
  
  // Validar precios
  if (precio_min && (isNaN(parseFloat(precio_min)) || parseFloat(precio_min) < 0)) {
    return res.status(400).json({
      error: 'El precio mínimo debe ser un número positivo'
    });
  }
  
  if (precio_max && (isNaN(parseFloat(precio_max)) || parseFloat(precio_max) < 0)) {
    return res.status(400).json({
      error: 'El precio máximo debe ser un número positivo'
    });
  }
  
  // Validar que precio_min no sea mayor que precio_max
  if (precio_min && precio_max && parseFloat(precio_min) > parseFloat(precio_max)) {
    return res.status(400).json({
      error: 'El precio mínimo no puede ser mayor que el máximo'
    });
  }
  
  // Validar límite de resultados
  if (limite && (isNaN(parseInt(limite)) || parseInt(limite) <= 0 || parseInt(limite) > 100)) {
    return res.status(400).json({
      error: 'El límite debe ser un número entre 1 y 100'
    });
  }
  
  res.json({ mensaje: 'Filtros válidos aplicados' });
});

Funciones auxiliares para validación

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

Para mantener el código organizado y reutilizable, podemos crear funciones auxiliares que encapsulen la lógica de validación común:

// Función para validar email
function validarEmail(email) {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(email);
}

// Función para validar longitud de cadena
function validarLongitud(texto, min, max) {
  if (typeof texto !== 'string') return false;
  return texto.length >= min && texto.length <= max;
}

// Función para validar número en rango
function validarRango(numero, min, max) {
  const num = parseFloat(numero);
  return !isNaN(num) && num >= min && num <= max;
}

// Uso en las rutas
app.post('/perfil', (req, res) => {
  const { nombre, email, biografia } = req.body;
  
  if (!validarLongitud(nombre, 2, 50)) {
    return res.status(400).json({
      error: 'El nombre debe tener entre 2 y 50 caracteres'
    });
  }
  
  if (!validarEmail(email)) {
    return res.status(400).json({
      error: 'Email inválido'
    });
  }
  
  if (biografia && !validarLongitud(biografia, 0, 500)) {
    return res.status(400).json({
      error: 'La biografía no puede exceder 500 caracteres'
    });
  }
  
  res.json({ mensaje: 'Perfil actualizado correctamente' });
});

Validación de tipos de datos complejos

Para estructuras de datos más complejas, podemos implementar validaciones que verifiquen arrays y objetos anidados:

app.post('/pedidos', (req, res) => {
  const { cliente, productos, direccion } = req.body;
  
  // Validar estructura del cliente
  if (!cliente || typeof cliente !== 'object') {
    return res.status(400).json({
      error: 'Los datos del cliente son requeridos'
    });
  }
  
  if (!cliente.nombre || !cliente.telefono) {
    return res.status(400).json({
      error: 'Nombre y teléfono del cliente son obligatorios'
    });
  }
  
  // Validar array de productos
  if (!Array.isArray(productos) || productos.length === 0) {
    return res.status(400).json({
      error: 'Debe incluir al menos un producto'
    });
  }
  
  // Validar cada producto
  for (let i = 0; i < productos.length; i++) {
    const producto = productos[i];
    
    if (!producto.id || !producto.cantidad || !producto.precio) {
      return res.status(400).json({
        error: `Producto en posición ${i + 1} tiene datos incompletos`
      });
    }
    
    if (isNaN(parseInt(producto.cantidad)) || parseInt(producto.cantidad) <= 0) {
      return res.status(400).json({
        error: `Cantidad inválida en producto ${i + 1}`
      });
    }
  }
  
  res.status(201).json({ mensaje: 'Pedido creado correctamente' });
});

La validación de entrada en Express nos permite interceptar datos incorrectos antes de que lleguen a la lógica de negocio, proporcionando respuestas claras sobre los errores encontrados y manteniendo la integridad de nuestras aplicaciones.

Aprendizajes de esta lección de Express

  • Comprender la importancia de la validación de entrada en aplicaciones Express.
  • Aprender a validar parámetros de ruta, consulta y cuerpo de las peticiones.
  • Implementar funciones auxiliares para reutilizar lógica de validación.
  • Validar estructuras de datos complejas como objetos anidados y arrays.
  • Gestionar respuestas de error claras ante datos inválidos para mantener la integridad de la aplicación.

Completa este curso de Express y certifícate

Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración