10.1-Usando app.route() en Express - CRUD Sencillo
¿Cuándo usar app.route()?
Úsalo cuando necesites la misma ruta con diferentes métodos HTTP
No lo compliques: usa @app.get(), @app.post(), etc. que son más claros
En resumen: app.route() es el método base, pero para la práctica diaria usa @app.get(), @app.post(), @app.put(), @app.delete() que son más explícitos y fáciles de leer.
Usando app.route() en Express - CRUD Sencillo
app.route() te permite encadenar múltiples métodos HTTP para la misma ruta, haciendo el código más limpio y organizado.
Tu código SIN agrupar (actual)
javascript
// Separados - cada uno independiente
app.get('/productos', (req, res) => {
res.json({ success: true, cantidad: productos.length, productos: productos });
});
app.post('/productos', (req, res) => {
const { nombre, precio } = req.body;
// ... lógica para crear
res.status(201).json({ mensaje: '✅ Producto creado' });
});
Tu código CON app.route() (agrupado)
javascript
// Agrupados - misma ruta, diferentes métodos
app.route('/productos')
.get((req, res) => {
res.json({ success: true, cantidad: productos.length, productos: productos });
})
.post((req, res) => {
const { nombre, precio } = req.body;
if (!nombre || !precio) {
return res.status(400).json({ error: 'Faltan datos' });
}
const nuevoProducto = {
id: productos.length + 1,
nombre: nombre,
precio: parseFloat(precio)
};
productos.push(nuevoProducto);
res.status(201).json({ mensaje: '✅ Producto creado', producto: nuevoProducto });
});
Ejemplo práctico COMPLETO con tu código
Así quedaría tu archivo usando app.route():
javascript
const express = require('express');
const app = express();
const PORT = 3000;
// Middlewares
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static('public'));
app.use('/css', express.static('node_modules/bootstrap/dist/css'));
app.use('/js', express.static('node_modules/bootstrap/dist/js'));
// Datos
let productos = [
…………………………….
];
// ✅ RUTAS AGRUPADAS con app.route()
app.route('/productos')
.get((req, res) => {
res.json({
success: true,
cantidad: productos.length,
productos: productos
});
})
.post((req, res) => {
const { nombre, precio } = req.body;
if (!nombre || !precio) {
return res.status(400).json({ error: 'Faltan datos: nombre y precio' });
}
const nuevoProducto = {
id: productos.length + 1,
nombre: nombre,
precio: parseFloat(precio)
};
productos.push(nuevoProducto);
res.status(201).json({
mensaje: '✅ Producto creado',
producto: nuevoProducto
});
});
// Ruta específica con parámetro (no se puede agrupar con los demás)
app.get('/productos/:id', (req, res) => {
const id = parseInt(req.params.id);
const producto = productos.find(p => p.id === id);
if (!producto) {
return res.status(404).json({ error: 'Producto no encontrado' });
}
res.json(producto);
});
// Ruta para formulario (POST separado porque la ruta es diferente)
app.post('/productos-formulario', (req, res) => {
const { nombre, precio } = req.body;
if (!nombre || !precio) {
return res.status(400).send('<h1>Error</h1><p>Faltan datos</p><a href="/">Volver</a>');
}
const nuevoProducto = {
id: productos.length + 1,
nombre: nombre,
precio: parseFloat(precio)
};
productos.push(nuevoProducto);
res.redirect('/');
});
// Ruta principal
app.get('/', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
});
app.listen(PORT, () => {
console.log(`🚀 Servidor en http://localhost:${PORT}`);
});
Comparativa directa
🎯 Regla práctica para Express
javascript
// ❌ NO agrupes si las rutas son diferentes
app.get('/productos') // GET /productos
app.post('/productos-form') // POST /productos-form (ruta diferente)
// ✅ SÍ agrupa si es la MISMA ruta
app.route('/productos')
.get() // GET /productos
.post() // POST /productos (misma ruta)
.put() // PUT /productos
.delete()// DELETE /productos
En resumen: En Express, app.route() es útil para organizar el mismo endpoint con diferentes métodos HTTP. Para tu ejemplo, los GET y POST de /productos SÍ se pueden agrupar, pero /productos/:id y /productos-formulario NO porque son rutas diferentes.
📝 RESUMEN
app.route() agrupa métodos HTTP para una misma ruta
Perfecto para CRUD donde la misma URL responde a GET, POST, PUT, DELETE
Hace el código más ordenado y mantenible
Puedes encadenar .get(), .post(), .put(), .delete(), .patch()
¡Así de simple es usar app.route()
Es una forma de encadenar métodos HTTP para la misma ruta en un solo lugar.
Sin app.route() (forma normal)
javascript
// Tres funciones separadas para la misma ruta
app.get('/usuarios', (req, res) => {
res.json({ mensaje: 'Obtener usuarios' });
});
app.post('/usuarios', (req, res) => {
res.json({ mensaje: 'Crear usuario' });
});
app.delete('/usuarios', (req, res) => {
res.json({ mensaje: 'Eliminar usuario' });
});
Con app.route() (más ordenado)
javascript
// Todo junto y más limpio
app.route('/usuarios')
.get((req, res) => {
res.json({ mensaje: 'Obtener usuarios' });
})
.post((req, res) => {
res.json({ mensaje: 'Crear usuario' });
})
.delete((req, res) => {
res.json({ mensaje: 'Eliminar usuario' });
});
Ejemplo REAL y práctico
javascript
const express = require('express');
const app = express();
app.use(express.json());
// Base de datos temporal
let productos = [
{ id: 1, nombre: 'Laptop', precio: 1000 },
{ id: 2, nombre: 'Mouse', precio: 25 }
];
// ✅ MISMA RUTA '/productos' con diferentes métodos
app.route('/productos')
.get((req, res) => {
// OBTENER todos
res.json(productos);
})
.post((req, res) => {
// CREAR uno nuevo
const nuevo = { id: productos.length + 1, ...req.body };
productos.push(nuevo);
res.status(201).json(nuevo);
})
.put((req, res) => {
// ACTUALIZAR todos (poco común pero posible)
productos = req.body;
res.json(productos);
})
.delete((req, res) => {
// ELIMINAR todos
productos = [];
res.json({ mensaje: 'Todos eliminados' });
});
app.listen(3000);
¿Por qué es útil?
Tu ejemplo con app.route()
javascript
// Así está ahora (separado)
app.get('/productos', (req, res) => { ... });
app.post('/productos', (req, res) => { ... });
// Así queda con route (junto)
app.route('/productos')
.get((req, res) => {
res.json({ success: true, cantidad: productos.length, productos });
})
.post((req, res) => {
const { nombre, precio } = req.body;
const nuevoProducto = { id: productos.length + 1, nombre, precio };
productos.push(nuevoProducto);
res.status(201).json({ mensaje: '✅ Creado', producto: nuevoProducto });
});
🎯 Regla de oro
Usa app.route() cuando:
✅ La ruta es EXACTAMENTE la misma
✅ Tienes 2 o más métodos HTTP para esa ruta
NO uses app.route() cuando:
❌ Las rutas son diferentes (ej: /productos y /productos/:id)
❌ Solo tienes un método (ej: solo GET)
La diferencia en 10 segundos
javascript
// Esto es desordenado 👎
app.get('/user', ...)
app.post('/user', ...)
app.put('/user', ...)
// Esto es ordenado 👍
app.route('/user')
.get(...)
.post(...)
.put(...)
En resumen
app.route() es un organizador para cuando tienes el mismo "endpoint" pero con diferentes verbos HTTP.
Como un cajón donde guardas todo lo relacionado a /productos:
GET /productos (sacar productos)
POST /productos (meter productos)
PUT /productos (reemplazar productos)
DELETE /productos (borrar productos)
Comentarios
Publicar un comentario