Express, parte 2: Conectar con MySQL

Dentro de nuestro directorio raíz vamos a crear un archivo llamado db.js con el siguiente código:

const mysql = require('mysql2/promise');

// Configuración de la conexión a la base de datos
const pool = mysql.createPool({
  host: 'host',
  user: 'user',
  password: 'password',
  database: 'nombre_de_la_base_de_datos',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

module.exports = pool;

(Modificar los valores de las propiedades host, user, password y database por los que corresponden en tu base de datos)

Podemos probar el funcionamiento editando el archivo app.js:

//Conexión a la base de datos.
const connection = require('./db');


//Ejemplo de cómo recuperar una lista de registros.
app.get('/eventos', async (req, res) => {
    const query = `
        SELECT id, nombre, descripcion, cupo
        FROM eventos
    `;
    try{
        [results] = await connection.query(query);
        res.json({ success: true, results });
    }catch(error){
        console.log(error);
        res.status(500).json({ success: false, message: 'Error al intentar recuperar los eventos' });
    }
});


//Ejemplo de cómo recuperar un registro por su ID.
app.get('/eventos/:ID', async (req, res) => {
    const {ID} = req.params;
    const query = `
        SELECT id, nombre, descripcion, cupo
        FROM eventos
        WHERE id = ?
    `;
    try{        
        [results] = await connection.query(query, [ID]);
        if(results.length < 1){
            res.status(404).json({ success: false, message: 'El evento no existe' });
        }else{
            res.json({ success: true, result: results[0] });
        }
    }catch(error){
        console.log(error);
        res.status(500).json({ success: false, message: 'Error al intentar recuperar el evento' });
    }
});

Si bien podemos ingresar en crudo las variables para conectarnos a la base de datos:

host: 'host',
user: 'user',
password: 'password',
database: 'nombre_de_la_base_de_datos',

Lo recomendable es que esta información venga de un archivo .env

.env

Este archivo contiene las variables de entorno y sus valores. Esta información es sensible y como buena práctica nunca debe ser subida a un repositorio como github:

Creamos en el raíz el archivo .env:

DB_HOST=host
DB_USER=user
DB_PASSWORD=password
DB_NAME=nombre_de_la_base_de_datos

(También modificar los valores de las propiedades con los que corresponden a tu base de datos)

Y modificamos db.js:

const mysql = require('mysql2/promise');

// Configuración de la conexión a la base de datos
const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

module.exports = pool;

Ahora para iniciar el servidor debemos cambiar:

node --watch app.js

Por:

node --env-file=.env --watch app.js

.env con doten

Si la versión de node es anterior a 20.6.0, no podremos iniciar el servidor con –env-file=.env

Una alternativa a esto es usar la dependencia de doten:

npm install dotenv

Y luego en el archivo app.js incluir al principio:

require('dotenv').config()

Probar los endpoints desde Postman

Podríamos probar las dos rutas nuevas que creamos desde el navegador, aunque lo aconsejable sería que empecemos a familiarizarnos con el postman:

Al consumir cada uno de los endpoint debemos tener en cuenta seleccionar correctamente el verbo, en este caso GET, aunque más adelante vamos a ver otros.

(Previamente llenar la tablas eventos con registros)