Cómo Capturar Parámetros de URL en Node.js y Express

En Express, hay varios métodos para capturar parámetros de una URL:

  • Parámetros de ruta (route params)
  • Parámetros de consulta (query params)
  • Parámetros de cuerpo (body params)

Configuración Inicial del Proyecto

Instalación de Dependencias

bash
# Crear un nuevo proyecto
mkdir url-params-demo
cd url-params-demo

Inicializar proyecto

bash
npm init -y

Instalar Express

bash
npm install express

Estructura Básica del Proyecto

bash
url-params-demo/
│
├── server.js
└── package.json

Tipos de Parámetros

1Parámetros de Ruta (Route Params):

Los parámetros de ruta son segmentos dinámicos en una URL que se definen utilizando el prefijo : en la ruta. Estos parámetros permiten capturar información específica de la URL, facilitando el manejo de rutas y la personalización de las respuestas en tus aplicaciones. Por ejemplo:

javascript
const express = require('express');
const app = express();

// Ejemplo básico de parámetro de ruta
app.get('/usuarios/:id', (req, res) => {
const usuarioId = req.params.id;
res.send(`Detalles del usuario con ID: ${usuarioId}`);
});

// Múltiples parámetros de ruta
app.get('/usuarios/:categoria/:id', (req, res) => {
const { categoria, id } = req.params;
res.send(`Categoría: ${categoria}, ID: ${id}`);
});

// Parámetros opcionales con expresión regular
app.get('/producto/:nombre?', (req, res) => {
const nombre = req.params.nombre || 'Producto no especificado';
res.send(`Nombre del producto: ${nombre}`);
});
2Parámetros de Consulta (Query Params):

Los parámetros de consulta se encuentran después del ? en la URL.

javascript
app.get('/buscar', (req, res) => {
// Obtener parámetros de consulta
const { termino, pagina = 1, limite = 10 } = req.query;

res.json({
  termino,
  pagina: Number(pagina),
  limite: Number(limite),
  resultados: [
    // Lógica de búsqueda aquí
  ]
});
});

// Ejemplo de URL: 
// /buscar?termino=nodejs&pagina=2&limite=20
3Parámetros de Cuerpo (Body Params):

Para capturar parámetros enviados en el cuerpo de una solicitud POST.

javascript
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(express.json()); // Middleware para parsear JSON
app.use(express.urlencoded({ extended: true })); // Para datos de formulario

app.post('/usuarios', (req, res) => {
const { nombre, email, edad } = req.body;

// Validación de datos
if (!nombre || !email) {
  return res.status(400).json({ error: 'Datos incompletos' });
}

res.status(201).json({
  mensaje: 'Usuario creado',
  usuario: { nombre, email, edad }
});
});

Validación Avanzada de Parámetros

Validación con Middleware Personalizado

javascript
// Middleware de validación para ID de usuario
const validarIdUsuario = (req, res, next) => {
const { id } = req.params;

if (!/^d+$/.test(id)) {
  return res.status(400).json({ 
    error: 'ID de usuario inválido' 
  });
}

next();
};

app.get('/usuarios/:id', validarIdUsuario, (req, res) => {
const usuarioId = req.params.id;
// Lógica de recuperación de usuario
});

Validación con Bibliotecas (Joi)

javascript
const Joi = require('joi');

const esquemaUsuario = Joi.object({
nombre: Joi.string().min(3).max(30).required(),
email: Joi.string().email().required(),
edad: Joi.number().min(18).max(100)
});

app.post('/usuarios', (req, res) => {
const { error, value } = esquemaUsuario.validate(req.body);

if (error) {
  return res.status(400).json({ 
    error: error.details[0].message 
  });
}

// Procesar usuario válido
res.status(201).json(value);
});
  Mejores Prácticas

  1. Siempre valida y sanea los parámetros de entrada
  2. Usa middleware para validaciones complejas
  3. Proporciona valores predeterminados para parámetros opcionales
  4. Maneja errores de manera consistente
  5. Usa bibliotecas de validación para esquemas complejos

Ejemplo Completo de Aplicación

javascript
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

// Middleware
app.use(express.json());

// Base de datos simulada
const usuarios = [
{ id: 1, nombre: 'Juan', email: 'juan@example.com' },
{ id: 2, nombre: 'María', email: 'maria@example.com' }
];

// Rutas con diferentes tipos de parámetros
app.get('/usuarios', (req, res) => {
const { limite = 10, pagina = 1 } = req.query;
res.json(usuarios.slice(0, Number(limite)));
});

app.get('/usuarios/:id', (req, res) => {
const id = Number(req.params.id);
const usuario = usuarios.find(u => u.id === id);

if (!usuario) {
  return res.status(404).json({ error: 'Usuario no encontrado' });
}

res.json(usuario);
});

app.listen(PORT, () => {
console.log(`Servidor corriendo en puerto ${PORT}`);
});