En este tutorial vamos a construir una API REST en Node usando Express y siguiendo buenas prácticas de desarrollo. Dividiremos el proceso en varias secciones para que puedas entender cada paso. Además, te recomiendo usar herramientas de Inteligencia Artificial (IA) para generar datos de ejemplo o para ayudarte a resolver dudas sobre temas que no domines completamente. La IA puede inspirarte con datos ficticios y sugerir soluciones, permitiéndote enfocarte en la estructura y las buenas prácticas de tu código. 🤖
Primero, crea una carpeta para tu proyecto y luego inicialízalo con tu gestor de paquetes favorito (en este ejemplo, se usa pnpm):
pnpm init
Instala las dependencias necesarias, como Express y herramientas para mantener un código limpio, como ESLint y Prettier:
pnpm add express
pnpm add -D eslint eslint-config-prettier globals nodemon prettier
Tu archivo package.json
se verá similar a este:
{
"name": "my-store",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "nodemon index.js",
"start": "node index.js",
"lint": "eslint ."
},
"type": "module",
"keywords": [],
"author": "",
"license": "ISC",
"packageManager": "[email protected]",
"devDependencies": {
"eslint": "^9.22.0",
"eslint-config-prettier": "^9.0.0",
"globals": "^14.0.0",
"nodemon": "^3.1.9",
"prettier": "^3.5.3"
},
"dependencies": {
"express": "^4.21.2"
}
}
Para asegurarte de seguir buenas prácticas, configura ESLint. Crea un archivo llamado eslint.config.mjs
y agrega la siguiente configuración:
import { defineConfig } from"eslint/config";import globals from"globals";import prettier from"eslint-config-prettier";
exportdefault defineConfig([
{
languageOptions: {
globals: {
...globals.node,
...globals.jest,
},
ecmaVersion: 2018,
sourceType: "module",
},
rules: {
"no-console": "warn",
"no-unused-vars": "error",
"no-undef": "error", // Error si se usa una variable no definida"init-declarations": ["error", "always"], // Fuerza la inicialización en la declaración"no-use-before-define": ["error", { functions: false, classes: true, variables: true }],
"prefer-const": "error"// Recomienda const si la variable no se reasigna
},
},
prettier,
]);
Comienza importando Express y creando una instancia de la aplicación. Establece también el puerto en el que el servidor escuchará:
import express from'express';
const app = express();
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Escuchando en puerto ${PORT}`);
});
Define el primer endpoint que responderá en la ruta /
. Este endpoint enviará una respuesta básica. Inicialmente, puedes simplemente mostrar un mensaje o un HTML básico:
const htmlContent = `
My Store
My Store
Products
About
API
`;
app.get('/', (req, res) => {
// Se reemplaza el título para mostrar un saludo personalizado
res.send(htmlContent.replace('My Store', 'Hola Express'));
});
Esta sección te enseña a iniciar un servidor básico y a crear un endpoint que envía una respuesta HTML simple. 😃
El contenido HTML se utiliza para facilitar la navegación entre las diferentes secciones de la aplicación. En nuestro ejemplo, el HTML contiene botones que redirigen a distintas rutas.
Observa cómo se utilizan los botones con la propiedad onclick
para navegar a los endpoints /products
, /about
y /api
. Esto te ayudará a entender cómo integrar la parte del front-end con tu servidor:
<buttononclick="location.href='/products'">Productsbutton>
<buttononclick="location.href='/about'">Aboutbutton>
<buttononclick="location.href='/api'">APIbutton>
Para la API, se utiliza un array de objetos que simulan productos. Puedes usar IA para generar estos datos de ejemplo si no dispones de datos reales o deseas experimentar con datos ficticios. La IA puede ayudarte a sugerir atributos, nombres y otros detalles para enriquecer tus ejemplos.
const products = [
{
id: 1,
name: 'Joya',
price: 50,
description: 'Hermosa joya artesanal',
category: 'Accesorios',
stock: 10,
rating: 4.5,
},
// ... otros productos
];
Este endpoint genera una tabla HTML con la información de cada producto. Se utiliza la función map
para recorrer el array y generar las filas de la tabla:
app.get('/products', (req, res) => {
const productsTable = `
${products.map(product => `
`).join('')}
ID
Nombre
Precio
Descripción
Categoría
Stock
Rating
${product.id}${product.name}${product.price}${product.description}${product.category}${product.stock}${product.rating}
`;
res.send(htmlContent.replace('My Store', `Products${productsTable}`));
});
Permite ver los detalles de un producto específico a través de un parámetro en la URL:
app.get('/products/:id', (req, res) => {
const product = products.find(p => p.id === parseInt(req.params.id));
if (product) {
const productDetails = `
Product Details
ID: ${product.id}
Nombre: ${product.name}
Precio: ${product.price}
Descripción: ${product.description}
Categoría: ${product.category}
Stock: ${product.stock}
Rating: ${product.rating}
Back to Products
`;
res.send(htmlContent.replace('My Store', productDetails));
} else {
res.status(404).send('Product not found');
}
});
Finalmente, crea un endpoint que responda con la información de los productos en formato JSON. Esto es útil para el consumo de la API por parte de otras aplicaciones:
app.get('/api', (req, res) => {
res.json(products);
});
Para arrancar tu servidor, utiliza el siguiente código:
app.listen(PORT, () => {
console.log(`Escuchando en puerto ${PORT}`);
});
Ejecuta el servidor en modo desarrollo con:
pnpm dev
Con esto, tu servidor estará corriendo y listo para atender las solicitudes en las rutas definidas. 👍
Usar IA puede ser de gran ayuda en diversas áreas:
Aprovechar estas herramientas te permitirá acelerar el desarrollo y mejorar la calidad de tus proyectos, dándote mayor confianza en la solución final. 🤩
En este tutorial has aprendido:
¡Ahora ya tienes los fundamentos para crear y escalar una API REST en Node usando buenas prácticas! Recuerda que la clave está en estructurar tu proyecto de manera modular, seguir las recomendaciones de los linters y estar abierto a usar herramientas innovadoras como la IA para mejorar tu flujo de trabajo.
Encuentra más proyectos y conecta conmigo en GitHub: https://github.com/nicoarbelaez
¡Feliz codificación y sigue explorando! 🎊