El ecosistema de Node.js, junto con el framework Express, ofrece una de las rutas más eficientes para desarrollar capas de backend que interactúen con bases de datos relacionales como MySQL. Esta combinación es ideal por su naturaleza asíncrona, su facilidad de escalabilidad y la rapidez con la que se pueden prototipar servicios web.
1. Inicialización del proyecto
Para comenzar, es necesario preparar el entorno de trabajo mediante la creación de un directorio para el proyecto y la inicialización de los metadatos de Node.js:
mkdir api-backend-express
cd api-backend-express
npm init -y
2. Gestión de dependencias
Instalaremos los paquetes fundamentales para el funcionamiento del servidor:
- express: Framework web minimalista.
- mysql2: Cliente para la comunicación con la base de datos MySQL.
- body-parser: Middleware para procesar los cuerpos de las solicitudes entrantes.
- cors: Herramienta para gestionar el intercambio de recursos de origen cruzado.
npm install express mysql2 cors body-parser
3. Diseño del esquema de datos
Antes de escribir la lógica del servidor, definiremos la estructura de las tablas en MySQL para un sistema básico de gestión de contenido:
CREATE DATABASE gestion_datos;
USE gestion_datos;
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre_usuario VARCHAR(100) NOT NULL,
correo_electronico VARCHAR(150) UNIQUE NOT NULL,
clave_acceso VARCHAR(255) NOT NULL,
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE articulos (
id INT AUTO_INCREMENT PRIMARY KEY,
id_autor INT NOT NULL,
encabezado VARCHAR(255) NOT NULL,
contenido TEXT NOT NULL,
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_autor) REFERENCES usuarios(id)
);
4. Implementación del servidor principal
A continuación, desarrollamos el archivo app.js que contendrá la lógica de conexión y los puntos de acceso (endpoints) de nuestra API:
const express = require('express');
const mysql = require('mysql2');
const cors = require('cors');
const bodyParser = require('body-parser');
const apiApp = express();
const serverPort = 3000;
// Configuración de Middlewares
apiApp.use(cors());
apiApp.use(bodyParser.json());
// Configuración del Pool de conexiones a MySQL
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'tu_password',
database: 'gestion_datos',
waitForConnections: true,
connectionLimit: 10
});
// Verificación de conectividad
pool.getConnection((err, connection) => {
if (err) {
console.error('Error al conectar con MySQL:', err.message);
return;
}
console.log('Conexión establecida exitosamente con la base de datos');
connection.release();
});
// Ruta de estado del servidor
apiApp.get('/api/status', (req, res) => {
res.status(200).json({ status: 'Online', message: 'Servidor Express operando correctamente' });
});
// Endpoint para obtener todos los artículos
apiApp.get('/api/articulos', (req, res) => {
const sqlStatement = 'SELECT * FROM articulos';
pool.query(sqlStatement, (err, data) => {
if (err) {
return res.status(500).send({ error: 'Fallo al recuperar los artículos' });
}
res.status(200).json(data);
});
});
// Endpoint para contar el volumen de artículos
apiApp.get('/api/articulos/conteo', (req, res) => {
const sqlStatement = 'SELECT COUNT(*) AS total FROM articulos';
pool.query(sqlStatement, (err, data) => {
if (err) {
return res.status(500).json({ error: 'Error en la consulta de conteo' });
}
res.json({ totalArticulos: data[0].total });
});
});
// Endpoint para registro de nuevos usuarios
apiApp.post('/api/auth/registro', (req, res) => {
const { nombre, email, password } = req.body;
const sqlStatement = 'INSERT INTO usuarios (nombre_usuario, correo_electronico, clave_acceso) VALUES (?, ?, ?)';
pool.query(sqlStatement, [nombre, email, password], (err, info) => {
if (err) {
console.error(err);
return res.status(500).json({ error: 'No se pudo completar el registro' });
}
res.status(201).json({ mensaje: 'Usuario dado de alta con éxito', id: info.insertId });
});
});
// Lanzamiento del servidor
apiApp.listen(serverPort, () => {
console.log(`API escuchando en: http://localhost:${serverPort}`);
});
5. Pruebas y validación
Una vez que el servidor está en ejecución mediante el comando node app.js, se pueden realizar pruebas de integración utilizando herramientas como Postman o Insomnia:
- GET:
http://localhost:3000/api/articulospara listar la información almacenada. - POST:
http://localhost:3000/api/auth/registroenviando un objeto JSON connombre,emailypasswordpara crear un nuevo registro.
Para entornos de producción, se recomienda integrar capas adicionales de seguridad, como el uso de variables de entorno para las credenciales de la base de datos (mediante dotenv) y el cifrado de contraseñas con librerías como bcrypt.