En esta sección vamos a ver cómo conectar nuestra aplicación a MySQL. Para poder hacer esta conexión necesitamos tener MySQL instalado. Esto lo podemos hacer mediante el programa XAMPP. Para empezar a utilizar MySQL necesitamos primeramente ejecutar XAMPP, una vez que ya esté ejecutado vamos a ir al botón MySQL y presionamos el botón start, vamos a necesitar también tener corriendo Apache, así que también presionamos el botón start de Apache Server, después presionamos el botón admin de la pestaña MySQL. Esto nos va a redirigir a phpMyAdmin donde vamos a crear una nueva base de datos y establecer la conexión a la base de datos. Pero antes de crear la base de datos, vamos a ir a nuestro proyecto y creamos una carpeta nueva llamada db.
En esta carpeta db vamos a crear un archivo que se va a llamar database.sql, este es un archivo de configuración para la base de datos que vamos a crear, es decir, no tiene nada que ver con nuestro proyecto, es solo una guía para nosotros. Ahora para crear una nueva base de datos, vamos a ir donde dice nuevo y vamos a ponerle el nombre companydb y elegimos utf8_unicode_ci del menu desplegable.
Creación de la tabla en la base de datos
Ahora, dentro de nuestra base de datos vamos a crear una tabla con los siguientes campos, El nombre de la tabla va a ser employee
, con los campos id
, name
, salary
, Primary Key
de la siguiente manera:
CREATE TABLE employee (
id INT (11) NOT NULL AUTO_INCREMENT,
name VARCHAR (45) DEFAULT NULL,
salary INT (5) DEFAULT NULL,
PRIMARY KEY (id)
)
Ahora que ya tenemos creada nuestra base de datos es momento de poder conectarla a nuestra aplicación.
Para realizar esta acción vamos a estar utilizando un módulo de NPM
que se llama MySQL
. Para instalarlo ejecutamos en consola el siguiente comando:
npm i mysql
Una vez que ya está instalado vamos a poder crear un archivo de conexión. Ahora vamos a crear un archivo nuevo que se va a llamar db.js
. Este archivo lo vamos a crear en la raíz de nuestro proyecto.
Módulo para poder realizar la conexión a la base de datos
Una vez que ya creamos este archivo, vamos a requerirlo el módulo, para esto utilizaremos el método require()
.
Este módulo MySQL
tiene una función especial que se llama createPool(), tiene dos, de hecho una es createConnection()
y la otra es createPool()
. El método createConnection()
es para mantener solamente un hilo de conexión, mientras que createPool()
es para manejar un conjunto de conexiones, este último se usa más que nada en producción.
Este objeto lo vamos a utilizar para poder conectarnos con nuestra base de datos:
createPool({
})
Este método espera un objeto de conexión, mismos qué son todos los parámetros de dónde está ubicada la base de datos, el nombre, la tabla y la contraseña y demás parámetros que son necesarios para poder realizar una conexión exitosa.
const mysql = require('mysql')
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '',
port: 3306,
database: 'companydb'
})
module.exports = pool
La conexión la estamos guardando dentro de una constante llamada pool
, que recibirá todos los parámetros que vamos a necesitar para hacer la conexión, finalmente, exportamos la constante pool
utilizando la sintaxis módule.export
para más tarde poder importarlo desde el archivo index.js
.
Listo sería todo, cuando necesitemos utilizar MySQL, lo único que tenemos que hacer es llamar al objeto pool
, el cual tiene un método query()
que es el que nos va a permitir extraer los datos que vamos a necesitar de nuestra base de datos.
En este punto vamos a abrir la consola y vamos a ejecutar nuestra aplicación con:
npm run dev
Probando la ruta ping
Ahora para poder utilizar este objeto pool
vamos a ir a nuestro archivo index.js
y crearemos una ruta nueva:
app.get('/ping', (req, res) => res.send('pong'))
Vamos a escribir app.get()
y cuando pidan la ruta /ping
vamos a devolver un texto 'pong
‘. Para comprobar, vamos a ir al navegador y escribir http://localhost:3000/ping
y vamos a ver un texto que dice pong
. Esto solo fue un ejemplo de que la ruta funciona. Pero lo que realmente se busca es que utilice la conexión a MySQL para que haga una consulta desde esa ruta.
Por ejemplo, una consulta a la base de datos sería algo como esto:
pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
Acá en lugar de devolver un texto "pong"
la consulta va a obtener un resultado de 1 + 1.
Convirtiendo callback a promesas con “util”
Ahora vamos a hacer la consulta desde la aplicación, utilizando pool
, vamos a llamar al método query()
que nos va a permitir hacer la consulta. En concreto, el módulo "mysql"
no admite promesas directamente. Por lo tanto, si se escribe código utilizando promesas (por ejemplo, con async/await
), es necesario utilizar el módulo "util"
de Node.js para envolver las funciones de "mysql"
y obtener soporte de promesas. Esto es para convertir las funciones de devolución de llamada (callbacks
) en promesas.
Para hacer esto, primero debemos importar el módulo "util"
de Node.js:
const util = require('util')
Luego, se utiliza la función util.promisify()
para convertir la función de devolución de llamada en una función que devuelve una promesa. Por ejemplo, para convertir la función pool.query()
en una función que devuelve una promesa, se puede hacer lo siguiente:
const query = util.promisify(pool.query).bind(pool)
De esta forma, la función query()
devolverá una promesa en lugar de aceptar una función de devolución de llamada. Puedes utilizar la función query()
de la misma manera que utilizarías la función pool.query()
original, pero en lugar de proporcionar una función de devolución de llamada, puedes usar la sintaxis async/await
para esperar la resolución de la promesa.
Función completa para conectar con MySQL
const mysql = require('mysql');
const util = require('util');
// Crea una conexión a la base de datos
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydatabase',
});
// Convierte la función pool.query() en una función que devuelve una promesa
const query = util.promisify(pool.query).bind(pool);
// Crea una ruta para la solicitud GET /ping
app.get('/ping', async (req, res) => {
try {
const result = await query('SELECT 1 + 1 AS result');
const value = result && result[0] && result[0].result;
res.json(value);
} catch (error) {
console.error(error);
res.status(500).send('Error al obtener la información');
}
})
Este ejemplo se está usando la función pool.query()
para realizar la consulta a la base de datos. La función query()
convertida en promesa se está utilizando en su lugar. Además, la sintaxis await
se está utilizando para esperar la resolución de la promesa en lugar de proporcionar una función de devolución de llamada.
query('SELECT 1 + 1 AS resultado')
Esta línea de código pareciera que está mal escrito donde dice SELECT 1 + 1 AS resultado
, pero lo que estoy haciendo es una operación dentro de la base de datos.
query('SELECT "pong" AS resultado')
Por ejemplo, en vez de utilizar una operación matemática como la línea anterior, escribo, "pong"
reemplazo el 1 + 1 por la palabra "pong"
, también funcionaría. Con esto tenemos comprobado que tenemos nuestra conexión a MySQL.