| Tutorial del Internet de las Cosas y Bluetooth con el ESP32Juan Antonio Villalpando
 Volver al índice del tutorial  ____________________________ 117.- Node.js y MySQL (MariaDB). - En el tutorial 117_Wemos_NodeJs.htm vimos como instalar de forma "Portable" Node.js en el ordenador para crear un Servidor Web. Es muy conveniente ver ese tutorial antes de comenzar este.  - En el tutorial 340C_appinventor_mysqli.htm vimos como gestionar una base de datos MySQL con App Inventor. - Ahora vamos a instalar el gestor de Base de Datos MariaDB (es prácticamente igual a MySQL) y gestionarla con Node.js desde App Inventor. - Vamos a: https://mariadb.org/download/ y bajamos el archivo instalable .msi, en mi caso mariadb-10.4.20-winx64.msi (58 MB), bajo esta versión porque la voy a instalar en Windows 7 y las versiones actuales solo se instalan en Windows 10.  - Tenemos instalado MariaDB, se encuentra en C:\Program Files\MariaDB 10.4\data.  
 - Se ejecutará como Servicio. 
 - HeidiSQL es como phpMyAdmin, para gestionar la base de datos, podemos crear bases de datos, tablas, campos, modificar, borrar, ver datos...  
 _________________________________________________________________ - Instalación del driver mysql en Node.js  - Volvemos a Node.js  - Instalamos el driver mysql en node  npm install mysql  
 ___________________________________________________________ - Para gestionar la Base de Datos MySql (MariaDB) vamos a seguir este tutorial:  https://www.w3schools.com/nodejs/nodejs_mysql.asp  ___________________________________________________________ 1.- Crear base de datos. CREATE BASE. 
        
          | create_db.js |  
          | 
var mysql = require('mysql');
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "1234",
});
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  con.query("CREATE DATABASE mydb", function (err, result) {
    if (err) throw err;
    console.log("Database created");
  });
});
 |  
 2.- Crear tabla. CREATE TABLE.  
        
          | create_table.js |  
          | 
var mysql = require('mysql');
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "1234",
  database: "mydb" // Data Base name.
});
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "CREATE TABLE customers (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), address VARCHAR(255))";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Table created");
  });
});	
 |  
 - En HeidiSQL podemos ver la base de datos mydb y la tabla customers que hemos creado.  
 - Si quisiéramos cambiar algo de la estructura de la tabla utilizaríamos ALTER  var sql = " ALTER TABLE customers ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY " ;  3.- Insertar datos. INSERT.  
        
          | insert_db.js |  
          | 
var mysql = require('mysql');
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "1234",
  database: "mydb" // Data Base name.
});
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "INSERT INTO customers (name, address) VALUES ('Company Inc', 'Highway 37')";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("1 record inserted");
  });
});			
 |  
 - Vamos a HeidiSQL y observamos el datos insertado.  
   4.- Archivo de conexión independiente. - En vez de poner los elementos de conexión en el mismo archivo que la orden mysql, vamos a poner los datos de conexión en otro archivo y luego requerirlo en el archivo de la orden. 
        
          | connect_db.js |  
          | 
var mysql = require('mysql');
config = {
  host: "localhost",
  user: "root",
  password: "1234",
  database: "mydb"
}
var connection =mysql.createConnection(config);
connection.connect(function(err){
  if (err){
    console.log('Error connecting:' + err.stack);
  }
  console.log('Connected successfully to DB.');
});
module.exports ={
     connection : mysql.createConnection(config) 
} 			
 |  
        
          | insert_db_con.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "INSERT INTO customers (name, address) VALUES ?";
  var values = [
    ['Peter', 'Lowstreet 4'],
    ['Amy', 'Apple st 652'],
    ['Hannah', 'Mountain 21'],
    ['Michael', 'Valley 345'],
    ['Sandy', 'Ocean blvd 2'],
    ['Betty', 'Green Grass 1'],
    ['Richard', 'Sky st 331'],
    ['Susan', 'One way 98'],
    ['Vicky', 'Yellow Garden 2'],
    ['Ben', 'Park Lane 38'],
    ['William', 'Central st 954'],
    ['Chuck', 'Main Road 989'],
    ['Viola', 'Sideway 1633']
  ];
  con.query(sql, [values], function (err, result) {
    if (err) throw err;
    console.log("Number of records inserted: " + result.affectedRows);
  });
});		
 |  
 5.- Seleccionar las columnas name y address. SELECT.  
        
          | select_db.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;
con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT name, address FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});
 |  
 - Observa la función devuelve err, result y fields. - Si añadimos   console.log(result[2].address);  obtenemos: 
 Apple st 652 6.- Seleccionar con filtro. WHERE. 
        
          | where_db.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;			
			
con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers WHERE address = 'Park Lane 38'", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});			
 |    
        
          | where_db2.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;			
			
con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers WHERE address LIKE 'S%'", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});		
 |    
        
          | where_db3.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;			
			
var name = 'Amy';
var adr = 'Mountain 21';
var sql = 'SELECT * FROM customers WHERE name = ? OR address = ?';
con.query(sql, [name, adr], function (err, result) {
  if (err) throw err;
  console.log(result);
});	
 |  - Escape se utiliza para evitar la inject SQL, esto es una forma de entrar en base de datos poco protegidas.  
        
          | where_escape_db.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;
			
var adr = 'Mountain 21';
var sql = 'SELECT * FROM customers WHERE address = ' + mysql.escape(adr);
con.query(sql, function (err, result) {
  if (err) throw err;
  console.log(result);
});
 |  7.- Ordenar. ORDER.  
        
          | order_db.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;
			
con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers ORDER BY name", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
 |  8.- Borrar. DELETE. 
        
          | delete_db.js |  
          | 
con.connect(function(err) {
  if (err) throw err;
  var sql = "DELETE FROM customers WHERE address = 'Mountain 21'";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Number of records deleted: " + result.affectedRows);
  });
});			
 |  9.- Actualizar. UPDATE.  
        
          | update_db.js |  
          | 
var config = require('./connect_db.js');
var con = config.connection;
			
con.connect(function(err) {
  if (err) throw err;
  var sql = "UPDATE customers SET address = 'Canyon 123' WHERE address = 'Valley 345'";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result.affectedRows + " record(s) updated");
  });
});
 |  ________________________________________________________ 10.- App Inventor. MySQL. Node.js  p340B_mysql_node_get.aia
 - Pondremos los códigos correspondientes a la conexión, Insertar, Borrar, Actualizar, Ver, Seleccionar en un solo archivo, en el archivo de la creación del servidor.  - Este será el nuevo archivo que creará el Servidor Web y con el que podremos gestionar la Base de datos. - CUIDADO con la 'comilla simple' y con las "comillas dobles", a veces '"están juntas"'. 
        
          | server.js |  
          | 
// Juan A. Villalpando
// http://kio4.com/arduino/117_Wemos_NodeJs_MySQL.htm
//-------------------------------------------------------------------------------------
var url = require('url');
var http = require('http');
var querystring = require('querystring');
var mysql = require('mysql');
//-------------------------------------------------------------------------------------
function requestHandler(request, response) {
    var uriData = url.parse(request.url);
    var pathname = uriData.pathname; 
    var query = uriData.query;
    var queryData = querystring.parse(query);
	
	var con = mysql.createConnection({
	  host: "localhost",
	  user: "root",
	  password: "1234",
	  database: "mydb" // Data Base name.
	});
    //--- INSERT ------------------------------------------------------------------------------
    if (pathname == '/insertar') {	
var name = queryData.name;
var address = queryData.address;
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "INSERT INTO customers (name, address) VALUES ('"+name+"','"+address+"')";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(name);
	response.end("Datos agregados a la base.");
  });
  con.end();
});
    //--- DELETE ------------------------------------------------------------------------------
  } else if (pathname == '/borrar') {
var name = queryData.name;
con.connect(function(err) {
  if (err) throw err;
   var sql = "DELETE FROM customers WHERE name ='"+name+"'";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Number of records deleted: " + result.affectedRows);
	response.end("Datos borrados.");
  });
   con.end();
});	
    //--- UPDATE ------------------------------------------------------------------------------
  } else if (pathname == '/actualizar') {
var name = queryData.name;
var address = queryData.address;
con.connect(function(err) {
  if (err) throw err;
   var sql = "UPDATE customers SET address = '"+address+"' WHERE name ='"+name+"'";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Number of records updated: " + result.affectedRows);
	response.end("Datos modificados.");
  });
   con.end();
});	
    //---- SELECT WHERE -----------------------------------------------------------------------
  } else if (pathname == '/buscar') {
var name = queryData.name;
var address = queryData.address;
con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers WHERE name = '"+name+"'", function (err, result) {
    if (err) throw err;
    console.log(result);
	response.end(JSON.stringify(result));
  });
   con.end();
});		
    //--- SELECT ------------------------------------------------------------------------------
  } else if (pathname == '/ver') {
var name = queryData.name;
var address = queryData.address;
con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers ", function (err, result) {
    if (err) throw err;
    console.log(result);
    response.end(JSON.stringify(result));
  });
      con.end();
});		
    //---------------------------------------------------------------------------------
    } else { 
            response.end("Wrong order.");
    }
    //---------------------------------------------------------------------------------
}
var server = http.createServer(requestHandler);
server.listen(8000); 
console.log('Server listening on port 8000');
 |  _______________________________________________ - Diseño. 
 _______________________________________________ - Bloques. 
 _______________________________ 
    		    |