Introducción a Node.js, parte 14: Conectar Node.js con MySQL

24 Ene

En las dos últimas publicaciones hemos visto cómo conectar y trabajar con una base de datos MongoDB, pero también dijimos en su momento que Node, al igual que otros lenguajes de programación, permite conectarse a múltiples base de datos, como por ejemplo MySQL.

Antes de continuar es importante saber, aunque creo que está de más decirlo, que debemos tener el servicio de MySQL instalado en nuestro sistema, y obviamente encendido. Yo en mi caso lo tengo con Xampp.

Primero vamos a crear una base de datos de prueba, idéntica a la que creamos en las publicaciones pasadas con Mongoose.

Y la tabla con el siguiente código:

CREATE TABLE personaje(
   personaje_id smallint(5) unsigned not null auto_increment primary key,
   nombre varchar(50) not null,
   apellido varchar(50) not null,
   biografia varchar(50) not null
);

Bien, esta será nuestra base de datos y la tabla que usaremos para probar lo siguiente.

Instalando el módulo de MySQL 

Para conectar una aplicación Node.js debemos tener el módulo de MySQL instalado, así que vamos a entrar dentro de nuestra carpeta de node desde la consola. En mi caso:

cd C:\Program Files\nodejs

Y vamos a instalar este nuevo módulo para que esté disponible en nuestros futuros proyectos:

npm install mysql

Conexión con MySQL

Ahora vamos a crear un nuevo proyecto al que yo simplemente llamaré conexion_mysql, y dentro de éste un archivo app.js. Al cual vamos editar con el siguiente código:

var mysql = require('mysql');
var connection = mysql.createConnection({
   host: 'localhost',
   user: 'root',
   password: '',
   database: 'node_mysql',
   port: 3306
});
connection.connect(function(error){
   if(error){
      throw error;
   }else{
      console.log('Conexion correcta.');
   }
});
connection.end();

Si seguiste las anteriores publicaciones de Node, verás que el código está muy claro. Incluimos el módulo de MySQL:

var mysql = require('mysql');

Luego definimos los datos de conexión, mediante el método createConnection():

var connection = mysql.createConnection({
   host: 'localhost',
   user: 'root',
   password: '',
   database: 'node_mysql',
   port: 3306
});

En realidad el puerto no es obligatorio, pero para estar más seguro yo lo puse como valor 3306, que es por donde funciona en mi máquina.

Luego sí, intentamos conectar mediante el método connect():

connection.connect(function(error){
   if(error){
      throw error;
   }else{
      console.log('Conexion correcta.');
   }
});

Este método tendrá un parámetro de tipo callback, que a su vez recibirá el error, si hubo alguno al intentar conectarse con la base de datos.

Y finalmente desconectamos la base de datos MySQL:

connection.end();

Consultas

Empezaremos realizando un INSERT en nuestra tabla:

var mysql = require('mysql');
var connection = mysql.createConnection({
   host: 'localhost',
   user: 'root',
   password: '',
   database: 'node_mysql',
   port: 3306
});
connection.connect(function(error){
   if(error){
      throw error;
   }else{
      console.log('Conexion correcta.');
   }
});
var query = connection.query('INSERT INTO personaje(nombre, apellido, biografia) VALUES(?, ?, ?)', ['Homero', 'Simpson', 'Esposo de Marge y padre de Bart, Lisa y Maggie.'], function(error, result){
   if(error){
      throw error;
   }else{
      console.log(result);
   }
 }
);
connection.end();

Como vemos en este ejemplo, utilizamos el método .query(), el cual recibirá tres parámetros. El primero será la consulta, y el segundo serán los valores de entrada; si no hay ninguno, entonces le pasamos un array vacío. Y finalmente un callback que se disparará cuando se obtenga la respuesta, al cual le pasamos dos parámetros, el error, si hubo alguno, y el resultado de la respuesta:

var query = connection.query('INSERT INTO personaje(nombre, apellido, biografia) VALUES(?, ?, ?)', ['Homero', 'Simpson', 'Esposo de Marge y padre de Bart, Lisa y Maggie.'], function(error, result){
   if(error){
      throw error;
   }else{
      console.log(result);
   }
}

Este mismo proceso sirve tanto para UPDATE como DELETE.

También podemos hacer un SELECT. Por ejemplo podríamos recuperar un registro por su ID:

var mysql = require('mysql');
var connection = mysql.createConnection({
   host: 'localhost',
   user: 'root',
   password: '',
   database: 'node_mysql',
   port: 3306
});
connection.connect(function(error){
   if(error){
      throw error;
   }else{
      console.log('Conexion correcta.');
   }
});
var query = connection.query('SELECT nombre, apellido, biografia FROM personaje WHERE personaje_id = ?', [1], function(error, result){
      if(error){
         throw error;
      }else{
         var resultado = result;
         if(resultado.length > 0){
            console.log(resultado[0].nombre + ' ' + resultado[0].apellido + ' / ' + resultado[0].biografia);
         }else{
            console.log('Registro no encontrado');
         }
      }
   }
);
connection.end();

Aquí recuperamos un registro por su ID, también preguntamos si ha habido un error. Pero si nos ha devuelto un resultado éste será un array. Como aquí estamos preguntando por un registro por su ID; en mi caso el 1, que fue el que inserté antes; Entonces preguntamos si ha devuelto más de un resultado, osea si encontró el registro, y de ser así recuperamos la posición 0, que por lógica sería la única que debería haberme vuelto:

if(resultado.length > 0){
   console.log(resultado[0].nombre + ' ' + resultado[0].apellido + ' / ' + resultado[0].biografia);
}else{
   console.log('Registro no encontrado');
}

Saludos!

Anterior: Introducción a Node.js, parte 13: CRUD con Mongoose

Siguiente: Introducción a Node.js, parte 15: Sesiones en Express

Redes sociables