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