Conectar NodeJS con MySQL y ExpressJS

   Conectar con MySQL en NodeJS de por si es tarea complicada, a menos que utilicemos el cliente de MySQL desarrollado por Felixge. En su repositorio de GitHub encontraremos bastante documentación sobre como implementarlo, sin embargo no nos explica como utilizarlo con ExpressJS.

   La ventaja que nos da este Framework es que podemos programar nuestra conexión en forma de módulo, lo que nos permitirá usar nuestra instancia de conexión en cualquier ruta de forma práctica y sencilla. Lo primero es crear el archivo, en este ejemplo lo he ubicado en la carpeta bin, sin embargo puedes crear una que sea mas conveniente de acuerdo a la estructura de tu proyecto:
/* Archivo mysql.js */

// Felixge/node-mysql
var mysql = require('mysql');

// Conexion a exportar
var connection = mysql.createConnection({
    host    : '127.0.0.1',
    user    : 'root',
    port    : '3306',
    password: '123456'
    database: 'testing'
});

// Evento en case de error
connection.on('error', function(err) {
    console.log(err.code);
});

// Exportar la variable como modulo
exports.connection = connection;
   De esta forma estamos exportando la conexión múltiples veces, sin necesidad de crearla para cada ruta o archivo a utilizar, para hacer nuestros querys desde cualquier ruta cargamos en una variable y lanzamos la sentencia SQL:
var express = require('express');
var router  = express.Router();

// Nuestra conexion dentro de bin
var database = require('../bin/mysql');

// Select simple
router.get('/select', function(req, res) {
    database.connection.query('SELECT nombre, apellido FROM usuarios', function(err, rows, fields) {
        res.json(rows);
    });
});

// Update con parametros
router.get('/update', function(req, res) {
    database.connection.query('SELECT nombre, apellido FROM usuarios WHERE id = ? AND doc = ?', ['id_val', 'doc_val'], function(err, result) {
        res.json(result);
    });
});

module.exports = router;
   Con esto ya estamos utilizando nuestra BD, pero este código puede mejorarse mucho, por ejemplo... Si quiero validar la conexión hacia el servidor antes de hacer cualquier cosa entonces agrego lo siguiente al archivo mysql.js dentro de bin:
// Exportar la variable como modulo
exports.connection = connection;

// Comprobar conexion
exports.connect = function(){
    connection.connect(function(err){
        if(!err) {
            return true;
        } else {
            console.log("MySQL-> %s", err);
            return err;
        }
    });
};
   Luego solo debo llamar desde el archivo www la función de esta forma:
// ...

var app   = require('../app');
var debug = require('debug')('control:server');
var http  = require('http');

/* MySQL */
 
var database = require('../bin/mysql');
database.connect(); //<-- Validar conexion

// ...
   ¿Y que tal si quiero que los parámetros de conexión se lean desde un archivo de configuración ubicado dentro del proyecto?
var config = ini.parse(fs.readFileSync('./bin/config.ini', 'utf-8'));

var connection = mysql.createConnection({
    host    : config.conn.servidor,
    user    : config.conn.usuario,
    port    : config.conn.puerto,
    password: config.conn.clave,
    database: config.conn.basededatos
});
Nota: Para esto he utilizado npm/ini


   ¿Y si quiero agregarle seguridad para que nadie pueda ver el usuario / clave de la base de datos? Entonces debemos combinar esto con lo explicado en la entrada Cifrado de NodeJS


Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión