Como conectar MySQL con Node js

Ser un frontend a veces no es suficiente, en algunas ocasiones necesitamos crear nuestros propios recursos y probar por nuestra cuenta el lado del backend. Ya la anterior semana publique como desplegar un servidor que usa MongoDB en heroku. Ahora toca conectar MySQL con Node js para crear nuestra propia API.

Antes de empezar, creo que es bueno presentar la estructura que voy a utilizar, en esta ocasión esta es la lista de las diferentes carpetas del proyecto:

index.js
app 
    |_ config
    |_ controllers
    |_ models
    |_ routes

Comenzamos primero instalando lo que necesitamos para que funcione nuestra app/ server.
Nota: Aquí nos saltamos los pasos de instalar XAMPP o todo caso LAMPP y que ya tenemos creada nuestra base de datos con datos ya creados.
Seguimos…

Conectar MySQL con Node js
npm install express mysql cors body-parser

Comenzamos creando primero el archivo para las configuraciones para conectar MySQL con Express, ya que nuestra aplicación que va a funcionar como servidor de nuestra api.

En la carpeta app/config creamos el archivo db.config.js y aquí colocamos nuestras credenciales de nuestra base de datos.

module.exports = {
HOST: "localhost",
USER: "root",
PASSWORD: "password",
DB: "producst"
};

En la carpeta app/models creamos el archivo db.js Aquí configuramos todo para conectar MySQL con Node

const mysql = require("mysql");
/* Buscamos el archivo que habíamos creado antes. */
const dbConfig = require("../config/db.config.js");

var connection = mysql.createPool({
host: dbConfig.HOST,
user: dbConfig.USER,
password: dbConfig.PASSWORD,
database: dbConfig.DB
});

module.exports = connection;

Seguido nos encargamos de traer los datos de nuestra base de datos, desde la tabla «Products». Como en ejemplo vamos a traer todos los datos que tenemos en Products y al mismo tiempo por ID

// Primero traemos nuestra base de datos
const sql = require("./db.js");

// constructor, nos conectamos al tabla de Products desde nuestra base de datos.
const Product = function(Products) {
  this.name = productos.name;
};

//Traemos todos los datos desde la tabla Products
Product.getAll = result => {
  sql.query("SELECT * FROM Products", (err, res) => {
    if (err) {
      console.log("error: ", err);
      result(null, err);
      return;
    }

    console.log("productos: ", res);
    result(null, res);
  });
};

//Buscamos datos por ID
Product.findById = (productId, result) => {
  sql.query(`SELECT * FROM Products WHERE id = ${productId}`, (err, res) => {
    if (err) {
      console.log("error: ", err);
      result(err, null);
      return;
    }

    if (res.length) {
      console.log("found productos: ", res[0]);
      result(null, res[0]);
      return;
    }

    // not found Product with the id
    result({ kind: "not_found" }, null);
  });
};

module.exports = Product;

Ya tenemos la conexión, pero necesito mostrar los datos y «verificar» que todo esté correcto. Para ello creamos un archivo en customer.controller.js dentro de la carpeta app/controllers y escribimos lo siguiente:

const Customer = require("../models/customer.model.js");

// Recibe todos los productos desde la base de datos
exports.findAll = (req, res) => {
  Customer.getAll((err, data) => {
    if (err)
      res.status(500).send({
        message:
          err.message || "Some error occurred while retrieving customers."
      });
    else res.send(data);
  });
};

// Buscamos un producto con productId
exports.findOne = (req, res) => {
  Customer.findById(req.params.productId, (err, data) => {
    if (err) {
      if (err.kind === "not_found") {
        res.status(404).send({
          message: `Not found Product with id ${req.params.productId}.`
        });
      } else {
        res.status(500).send({
          message: "Error retrieving Product with id " + req.params.productId
        });
      }
    } else res.send(data);
  });
};

Ahora vamos a declarar ahora las rutas de nuestra API. Creamos primero el archivo products.routes.js dentro de la carpeta app/routes.

module.exports = app => {
const productos = require("../controllers/customer.controller.js");
// Recibe todos los productos all Customers
app.get("/productos", productos.findAll);

// Recibimos un producto desde Producto con productId
app.get("/productos/:productId", productos.findOne);
};

Lo que sigue es escribir lo necesario para conectar MySQL con Node js con express, cors alguna que otra configuracion extra, para que esto funcione correctamente. Todo esto en el archivo index.js

const express = require("express");
const cors = require("cors")
const bodyParser = require("body-parser");

const app = express();

app.use(cors())
const corsOptions = {
  origin: 'http://example.com',
  optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204
}
// parse requests of content-type - application/json
app.use(bodyParser.json());

// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

// simple route
app.get("/", cors(corsOptions), (req, res) => {
  res.json({ message: "Welcome" });
});

require("./app/routes/customer.routes.js")(app);

// set port, listen for requests
const PORT = process.env.PORT || 5555;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});

Espero que esto le sirva para algún proyecto o los saque de algún apuro del lado del Backend con un poco de paciencia y buen humor podremos conectar mySQL con Node js y tener un servidor para usar dichos datos como una API.