Nodejs è una runtime orientata agli eventi che ha portato l’interpretazione e l’esecuzione del codice Javascript anche lato server tramite il motore Javascript V8 di Google Chrome.

La caratteristica fondamentale di Nodejs è che ha un approccio asincrono quando un evento viene generato: ciò dovrebbe garantire una certa efficienza delle applicazioni grazie ad un sistema di callback gestito a basso livello dal runtime. Grazie a questo comportamento il runtime può fare altre attività nell’attesa che un task restituisca la sua risposta.

In questo articolo analizzeremo uno dei moduli più usati di Nodejs per creare API e comunicare con un Database MySql: Express.

E’ un approccio particolare perché di solito si tende a far comunicare con Express un database NoSql, ma si ottengono ottime prestazioni anche con MySql. Per creare un server che gestisce una base di dati creeremo 4 files che nomineremo server.js, routes.js, provaController.js e config.js.

Per far funzionare il progetto base che andremo a realizzare di seguito, dovremo installare Nodejs e alcuni componenti aggiuntivi tramite riga di comando. Sarà un progetto che costituirà un modello per capire le potenzialità di Nodejs e dei suoi moduli per realizzare applicazioni. Per installare Nodejs potete scaricarlo da questo link.

Iniziamo con il codice del file server.js: all’interno di esso creeremo con Nodejs un server importando alcuni dei componenti fondamentali. I componenti da installare sono: Express, Body-parser e Cors. Essi possono essere installati lanciando il comando npm in questo modo ad esempio:


$ npm install cors

Nel file server.js inseriamo il seguente codice che servirà a istanziare un server in ascolto sulla porta 3000:

server.js

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const routes = require('routes');
const validator = require('validator');
const app = express();
const PORT = 3000;

app.use(cors());
app.use(bodyParser.json());

app.get('/', (req, res) => {
    res.send({ messaggio : "It works!" });
});

//fine inizializzazione
app.use('/', routes);

app.listen(PORT, function() {
    console.log("Il server è in esecuzione sulla porta: " + PORT);
});

//evita che node si chiuda su un errore
process.on('uncaughtException', function (err) {
    console.log('Caught exception: ', err);
});
  

Realizziamo ora il file config.js di configurazione dei parametri del Database e il file db.js che istanzia l’oggetto conn che ha la connessione con il DB MySql:

config.js

const config = {
    "dbdriver": "mysql",
    "dbhost": "localhost",
    "dbusername": "root",
    "dbpassword": "root",
    "db": "dbprova",
    "dbport": 3306
}

module.exports = config;
db.js

const config = require('config');
const mysql = require('mysql');

const conn = mysql.createConnection({
    host     : config.dbhost,
    user     : config.dbusername,
    password : config.dbpassword,
    database : config.db
});

module.exports = conn;

Ora configuriamo il file routes.js che ha al suo interno le rotte del nostro applicativo server. A seconda dell’url che viene immesso nella barra degli indirizzi il nostro applicativo viene instradato su un controller specifico:


var express = require('express');
var router = express.Router();
var provaController = require('provaController');

router.get('/prove/',provaController.getProve);
//se dovessimo prendere un solo oggetto prova con parametro
//router.get('/prove/:id/',provaController.getProve);

module.exports = router;

L’ultimo file che andremo a realizzare è il file del provaController.js che conterrà la logica dell’applicativo ed eseguirà la query restituendoci i dati dal DB in formato JSON:


const db = require('db');

exports.getProve = (req, res, next) => {
    //let id = req.params.id; se dovessimo recuperare il parametro id in GEt dall'URL, altrimenti metto solo il codice per effettuare la query
    if(!validator.isNumeric(id) || id == 0){
        res.send('Parameter error: invalid parameters');
    }else{
        db.query("SELECT * FROM prova WHERE id = " + id, (err, rows, fields) => {
            if(err){
                res.send('Query error: ' + err.sqlMessage);
            }else{
                res.json(rows);
            }
        });
    }
};

Arrivati fin qui abbiamo creato un backend funzionante. Andrà avviato tramite il comando qui di seguito e il server risponderà sull’indirizzo https://localhost:3000/ :


$ node server.js