Académique Documents
Professionnel Documents
Culture Documents
Cours Nodejs Express L3 2020
Cours Nodejs Express L3 2020
________________________________________________________________________________________________
donnée en mémoire tampon. Ces applications
Développement produisent simplement les données en morceaux.
d’applications Web Node.js est la technologie de serveur Web utilisée
avec NodeJS entre autres par les sites de compagnies
comme : Youtube, Yahoo, Amazon, Netflix,
eBay, Reddit,
LinkedIn, Paypal, Groupon ou Walmart.
Partie 1. Qu'est-ce que node.js ?
Node.js fournit également une riche bibliothèque Après installation , on aura des commandes
de divers modules JavaScript, ce qui simplifie "node" pour exécuter le code javascript et "npm"
grandement le développement d'applications Web pour télécharger les différents moddules.
utilisant Node.js.
# node –v
Node.js = Runtime Environment + JavaScript
Library # npm –v
• Pas de mise en mémoire tampon - Les Il s'agit du fichier de configuration utilisé par npm
applications Node.js ne mettent jamais aucune pour décrire notre application. On y retrouve
ENI RV NodeJS et ExpressJS p.2
________________________________________________________________________________________________
notamment le nom et la version courante de notre Tous les modules node sont installés dans le
application. On retrouve également les répertoire node_modules et sont décrits dans
dépendances nécessaires au bon fonctionnement vos dépendances du fichier package.json.
de notre application.
Pour desiinstaller un module : npm uninstall
Remarquez que l'on a deux champs qui nom_module
permettent de décrire les dépendances :
Historique du Javascript
• le champ "dependencies"
• le champ "devDependencies"
npm install
ENI RV NodeJS et ExpressJS p.3
________________________________________________________________________________________________
________________________________________________________________________________________________
comment on écrirait le code dans un modèle
bloquant :
1. Télécharger un fichier
2. Afficher le fichier
3. Faire autre chose
Télécharger un fichier
Dès que c'est terminé, afficher le fichier
Faire autre chose
Le moteur V8
________________________________________________________________________________________________
var callback = function (error, response, body) {
console.log("Fichier téléchargé !");
});
request('http://www.site.com/fichier.zip', callback);
request('http://www.site.com/autrefichier.zip',
callback);
request('http://www.site.com/fichier.zip', function
(error, response, body) {
console.log("Fichier téléchargé !");
});
console.log("Je fais d'autres choses en
attendant...");
request('http://www.site.com/fichier.zip', callback);
console.log("Je fais d'autres choses en
attendant...");
________________________________________________________________________________________________
serveur un thread se charge de la gérer, et
il n’est libéré qu’une fois que les opérations
demandées par la requête en question
sont achevées, le thread est donc bloqué.
—
________________________________________________________________________________________________
node monfichier.js
var nb=5000000;
var somme=0;
ENI RV NodeJS et ExpressJS p.8
________________________________________________________________________________________________
for (var i=0; i<nb; i++) { dossier appelé "node_modules". C'est une
convention de Node.js :
somme+=Math.cos(i);
var test = require('test'); // Fait appel à test.js
} (sous-dossier node_modules)
var ms=t2.getTime()-t1.getTime();
Pour éviter d’utiliser du chemin relatif , il faut console.log permet d’afficher du texte sur la
mettre votre fichier test.js dans un sous- console « serveur ».
ENI RV NodeJS et ExpressJS p.9
________________________________________________________________________________________________
function bonjour( nom) { // Permet l'accès aux fonctions définies dans
monModule.js
console.log("Bonjour "+nom);
// Notez que le ./ est indispensable
}
monModule.fonctionTresUtile();
//monModule.f1();
exports.bonjour = bonjour;
// exports.f2= bonjour;
exports.somme = function(x,y){
return x+y ;
}) ;
________________________________________________________________________________________________
console.log('L\'aire d\'un cercle de rayon 4 est $ Pour l'installer globalement le module vue cli , on
{moncercle.aire(4)}'); // appel de fonction du va ajouter le paramètre -g à la commande npm :
module
Pour installer localement un module, placez- ... NPM va chercher sur les serveurs s'il y a de
vous dans le dossier de votre projet et tapez : nouvelles versions des modules, puis mettre à
jour les modules installés sur votre machine et il
npm install nomdumodule supprimera les anciennes versions.
NPM va télécharger automatiquement la dernière npm install peut être utilisé après avoir modifié le
version du module et il va la placer dans fichier package.json
un sous-dossier node_modules.
Par exemple :
npm install express
{
var express = require ( 'express' ) ; // utilise le "name": "mon-app",
module express dans l’application "version": "0.1.0",
"dependencies": {
Pour desinstaller , "markdown": "~0.4"
npm uninstall nomdumodule }
}
________________________________________________________________________________________________
{
"name": "mon-app",
"version": "0.1.0",
"dependencies": {
"markdown": "~0.4"
}
}
"dependencies": {
"markdown": "~0.3.5" // OK pour les versions
0.3.5, 0.3.6, 0.3.7, etc. jusqu'à la version 0.4.0
non incluse
ENI RV NodeJS et ExpressJS p.12
________________________________________________________________________________________________
} La fonction de callback est donc appelée à
chaque fois qu'un visiteur se connecte à notre
Si vous voulez, vous pouvez ne pas indiquer de site. Elle prend 2 paramètres :
numéro de patch. Dans ce cas, les modules
seront mis à jour même si l'application change de • La requête du visiteur (req) : cet objet
version mineure : contient toutes les informations sur ce que
le visiteur a demandé. On y trouve le nom
"dependencies": { de la page appelée, les paramètres, les
"markdown": "~0.3" // OK pour les versions éventuels champs de formulaires remplis...
0.3.X, 0.4.X, 0.5.X jusqu'à la version 1.0.0 non • La réponse à renvoyer au client (res) :
incluse c'est cet objet qu'il faut remplir pour donner
} un retour au visiteur. L’objet response
contiendra en général le code HTML de la
Attention néanmoins : entre deux versions page à renvoyer au client par le callback.
mineures, un module peut changer suffisamment
et votre application pourrait être incompatible. On
recommande d'accepter uniquement les mises à
jour de patch, c'est le plus sûr. Tester le serveur HTTP
________________________________________________________________________________________________
// http est un objet qui porte les définies dans le Mozilla/5.0 (Windows NT 5.1; rv:52.0)
module http Gecko/20100101 Firefox/52.0
Dans le console :
GET /
ENI RV NodeJS et ExpressJS p.14
________________________________________________________________________________________________
var http = require('http') ;
var url = require('url') ;
Le routage consiste à établir des associations Exemple 2 : lire et afficher 3 fichiers HTML.
entre des URL et des contenus que le serveur doit ( indexhtml, about.html, contact.html ) en
fournir. On va se servir d'une propriété de fonction du paramètre de routage.
l'objet requete, qui va nous permettre de
récupérer des informations sur l'URL. Pour cela, il la fonction fs.createReadStream() est utilisé pour
va falloir importer un autre module de node, le lire le fichier en morceaux de la taille spécifiée.
module url en ajoutant var url = require('url');. On Avec createReadStream,on utilise l’événement
peut alors accéder à l'URL saisie, pipe() qui aide à écrire les données de réponse
dans le navigateur.
index.html
<html>
<head>
<title> Homepage </title>
ENI RV NodeJS et ExpressJS p.15
________________________________________________________________________________________________
</head> response . writeHead ( 200 , { 'Content-
<body> Type' : 'text/html' } ) ;
<h1> Homepage </h1> fs . createReadStream ( 'index.html' ) . pipe (
This is homepage. response ) ;
</body> }
</html> } ) . listen ( 8081 ) ;
________________________________________________________________________________________________
• Les paramètres qui circulent dans l'URL
(ex : http://localhost:8080/mapage? var server = http.createServer(function(req, res) {
nom=dupont&prenom=robert). var page = url.parse(req.url).pathname;
console.log(page);
Quelle est la page demandée par le visiteur ? res.writeHead(200, {"Content-Type":
"text/plain"});
Pour récupérer la page demandée par le visiteur, if (page == '/') {
on va faire appel à un nouveau module de Node res.write('Vous êtes à l\'accueil, que puis-je
appelé "url". On demande son inclusion avec : pour vous ?');
}
else if (page == '/sous-sol') {
var url = require("url");
res.write('Vous êtes dans la cave à vins, ces
bouteilles sont à moi !');
Ensuite, il nous suffit de "parser" la requête du }
visiteur pour obtenir le nom de la page else if (page == '/etage/1/chambre') {
demandée : res.write('Hé ho, c\'est privé ici !');
}
url.parse(req.url).pathname; res.end();
});
Voici un code très simple :: server.listen(8080);
________________________________________________________________________________________________
var url = require('url'); La partie javascript
var querystring = require('querystring');
Toujours dans le dossier de votre projet, créez un
var server = http.createServer(function(req, res) { fichier mysql.js destiné à intégrer le code
var params = javascript se connectant à la base de données
querystring.parse(url.parse(req.url).query); mysql.
res.writeHead(200, {"Content-Type":
"text/plain"}); Récupérez une instance d’objet mysql depuis le
if ('prenom' in params && 'nom' in params) { module installé :
res.write('Vous vous appelez ' +
params['prenom'] + ' ' + params['nom']); var mysql = require('mysql');
}
else { Créer un objet de connexion (conn) à la base de
res.write('Vous devez bien avoir un prénom données par le biais de l’objet mysql
et un nom, non ?');
}
var conn = mysql.createConnection({
res.end();
host : "localhost",
});
user : "user",
server.listen(8080);
password : "password",
database : "mysqlTest"
Test : tapez dans un navigateur });
http://localhost:8080?
prenom=Robert&nom=Dupont pour voir le prénom
et le nom conn.connect(function(err) {
if (err) throw err;
Réponse : Vous vous appelez Robert Dupont console.log("Connected!");
});
Schéma résumé pour recupérer l'URL et les
paramètres avec Node.js
Extraction des données : première méthode
________________________________________________________________________________________________
if (error) {
// Afficher toutes les lignes
console.log(error);
sqlQuery.on("result", function(row) {
con.end(); console.log('nom: ' + row.nom);
console.log('ville: ' + row.ville);
return; });
} sqlQuery.on("end", function() {
con.end();
});
if ( results.length > 0 ) {
sqlQuery.on("error", function(error) {
var firstResult = results[ 0 ]; // récuperer le console.log(error);
premier enregistrement });
console.log("Database created");
con.end(function(err) {
// The connection is terminated now }
});
con.destroy(); )
________________________________________________________________________________________________
}); var sql = "INSERT INTO client (name, address)
VALUES ('Company Inc', 'Highway 37')";
con.query(sql, function (err, result) {
con.connect(function(err) {
if (err) throw err; if (err) throw err;
console.log("Connected!");
var sql = "CREATE TABLE client (id INT console.log("1 record inserted");
AUTO_INCREMENT PRIMARY KEY, name
});
VARCHAR(255), address VARCHAR(255))";
con.connect(function(err) {
Mettre à jour la structure d’une table if (err) throw err;
console.log("Connected!");
var sql = "INSERT INTO customers (name,
address) VALUES ?";
con.connect(function(err) { var values = [
['John', 'Highway 71'],
if (err) throw err;
['Peter', 'Lowstreet 4'],
['Amy', 'Apple st 652'],
console.log("Connected!");
['Hannah', 'Mountain 21'],
var sql = "ALTER TABLE client ADD COLUMN ['Michael', 'Valley 345'],
id INT AUTO_INCREMENT PRIMARY KEY"; ['Sandy', 'Ocean blvd 2'],
['Betty', 'Green Grass 1'],
con.query(sql, function (err, result) { ['Richard', 'Sky st 331'],
['Susan', 'One way 98'],
if (err) throw err; ['Vicky', 'Yellow Garden 2'],
['Ben', 'Park Lane 38'],
console.log("Table altered");
['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: " +
Insertion d’une ligne result.affectedRows);
});
con.connect(function(err) { });
________________________________________________________________________________________________
var query = connection.query('INSERT INTO { id: 10, name: 'Vicky', address: 'Yellow Garden
posts SET ?', post, function (error, results, fields) { 2'},
if (error) throw error; { id: 11, name: 'Ben', address: 'Park Lane 38'},
// Neat!
{ id: 12, name: 'William', address: 'Central st
});
console.log(query.sql); // INSERT INTO posts 954'},
SET `id` = 1, `title` = 'Hello MySQL' { id: 13, name: 'Chuck', address: 'Main Road
989'},
Selection des lignes { id: 14, name: 'Viola', address: 'Sideway 1633'}
]
Selectionner tous les clients et afficher les objets
resultats: Clause LIMIT
________________________________________________________________________________________________
var clientId = 'c2'; });
});
con.query('SELECT * FROM client WHERE
codecli= ?', [clientId], function(err, results) { [
{ user: 'John', favorite: 'Chocolate Heaven' },
var firstResult = results[ 0 ]; { user: 'Peter', favorite: 'Chocolate Heaven' },
{ user: 'Amy', favorite: 'Tasty Lemons' }
console.log('codecli: ' + firstResult['codecli']); ]
________________________________________________________________________________________________
if (err) throw err; con.end();
// ...
$ mkdir myapp
}); $ cd myapp
var sql = "DELETE FROM client WHERE nom= Cette commande vous invite à fournir un certain
'jean'"; nombre d’informations, telles que le nom et la
version de votre application. Pour le moment,
con.query(sql, function (err, result) { vous pouvez simplement appuyer sur la touche
RETURN pour accepter les valeurs par défaut, à
if (err) throw err; l’exception de ce qui suit :
________________________________________________________________________________________________
Entrez app.js ou un nom de votre choix pour le Pour installer Express de façon temporaire et ne
fichier principal. Si vous souhaitez que le nom soit pas l’ajouter à la liste des dépendances, omettez
index.js, appuyez sur la touche RETURN pour l’option --save :
accepter le nom de fichier par défaut suggéré.
Press ^ C at any time to quit . Les modules Node.js installés à l’aide de l’option
--save sont ajoutés à la liste des dépendances
name : ( myapp ) dependencies, dans le fichier package.json. Par
version : ( 1.0.0 ) défaut, depuis la version 5.0, npm install
description : Node . js CRUD application using <package-name> ajoute automatiquement le
MySQL module Node.js à la liste des dépendances. Par la
entry point : ( index . js ) suite, l’exécution de npm install dans le
test command : répertoire de l’application installera
git repository : automatiquement les modules présents dans la
keywords : node , crud , mysql liste des dépendances.
author : Mukesh Chapagain
license : ( ISC )
________________________________________________________________________________________________
du côté client (sous-dossier « javascript »), app . get ( '/' , function ( request , response ) {
et les CSS (sous-dossier « stylesheets »).
response . send ( 'Hello World' ) ; // affiche le
- Le fichier de base app.js est déjà prêt à texte dans le navigateur
fournir un serveur web « vide » de base.
Exemple d’une application Node.js & Express 3) Maintenant, ouvrez votre navigateur et
naviguez sur http://127.0.0.1:8081 . Vous devriez
1) Créez un nouveau fichier nommé app.js dans pouvoir voir le texte Hello World affiché dans votre
le répertoire myapp navigateur.
App.js
________________________________________________________________________________________________
})
Méthodes de réponse
// --
ENI RV NodeJS et ExpressJS p.26
________________________________________________________________________________________________
Routes simples avec Express
La fonction suivante permet de définir des
itinéraires dans une application Express -
Par exemple,
});
app.listen(3000);
________________________________________________________________________________________________
route donnée et utilisant la même fonction. Par Enfin, Express permet de gérer des routes
exemple, dynamiques, c'est-à-dire des routes dont
certaines parties sont variables. Pour reprendre
app.all('/test', function(req, res){ l'exemple précédent avec page1, page2 et page3,
on aurait pu écrire…
res.send("HTTP method doesn't have any effect
on this route!"); app.get('/page:num', function(req, res){
res.send('Ceci est la page '+req.params.num) ;
}); }) ;
________________________________________________________________________________________________
res.setHeader('Content-Type', 'text/plain'); res.send('Page Listing');
res.end('Vous êtes à la chambre de l\'étage n°'
+ req.params.etagenum); })
});
Il s’agit d’exemples de chemins de routage basés
Cela vous permet de créer de belles URL et vous sur des masques de chaîne.
évite d'avoir à passer par le suffixe ("?
variable=valeur") pour gérer des variables. Ainsi, Ce chemin de routage fait correspondre acd et
toutes les routes suivantes sont valides : abcd.
• /etage/1/chambre
• /etage/2/chambre app.get('/ab?cd', function(req, res) {
• /etage/3/chambre res.send('ab?cd');
• /etage/nawak/chambre });
Routage de base
Ce chemin de routage fait correspondre abcd,
Le routage consiste à déterminer comment une abbcd, abbbcd, etc.
application répond à une demande client
adressée à un point de terminaison particulier, à
savoir un URI (ou chemin) et une méthode de app.get('/ab+cd', function(req, res) {
requête HTTP spécifique (GET, POST, PUT, res.send('ab+cd');
DELETE ou toute autre méthode de demande });
HTTP.).
Ce chemin de routage fait correspondre abcd,
Express prend en charge les méthodes de abxcd, abRABDOMcd, ab123cd, etc.
routage suivantes qui correspondent aux
méthodes HTTP : get, post, put, delete, etc…
app.get('/ab*cd', function(req, res) {
Nous allons étendre notre programme Hello World res.send('ab*cd');
pour traiter davantage de types de requêtes });
HTTP.
res.send('Hello GET'); })
})
// This responds a GET request for route // This responds a DELETE request for the
/list/user page. /del_user page.
________________________________________________________________________________________________
console.log("Got a DELETE request for
/del_user");
res.send('Hello DELETE');
})
})
Écran montrant à nouveau
http://127.0.0.1:8081/abcdefg
Enregistrez le code ci-dessus dans un fichier
nommé server.js et exécutez-le à l'aide de la
commande suivante.
$ node server.js
Gestionnaires de routage
________________________________________________________________________________________________
puis passer aux routes suivantes si aucune raison res.send('Hello from C!');
n’est fournie pour traiter la route actuelle. }
________________________________________________________________________________________________
</form> })
{"first_name":"John","last_name":"Paul"}
app.use(express.static('public'));
Méthode POST
app.get('/index.htm', function (req, res) {
Voici un exemple simple qui transmet deux
res.sendFile( __dirname + "/" + "index.htm" ); valeurs à l'aide de la méthode HTML FORM
POST. Nous allons utiliser process_get router
}) dans server.js pour gérer cette entrée.
response = { <body>
</body>
var server = app.listen(8081, function () {
</html>
var host = server.address().address
server.js pour gérer les requêtes de page
var port = server.address().port
d'accueil ainsi que les entrées envoyées par le
formulaire HTML.
console.log("Example app listening at http://%s:
%s", host, port)
var express = require('express');
ENI RV NodeJS et ExpressJS p.32
________________________________________________________________________________________________
var app = express(); First Name:
app.use(express.static('public'));
Express et les middlewares
app.get('/index.htm', function (req, res) {
Express est un framework basé sur le concept de
res.sendFile( __dirname + "/" + "index.htm" ); middlewares qui sont des fonctions ou morceaux
d'application qui rendent chacun un service
}) spécifique. Une application Express n’est qu’une
succession d’appels de fonctions middleware.
________________________________________________________________________________________________
• serve-static : permet de renvoyer des
fichiers statiques contenus dans un
dossier (images, fichiers à télécharger...)
• serve-favicon : permet de renvoyer la
favicon du site
• csrf : fournit une protection contre les
failles CSRF
• etc.
app.use(morgan('combined')) // Active le
middleware de logging
.use(express.static(__dirname + '/public')) //
Indique que le dossier /public contient des fichiers
statiques (middleware chargé de base)
.use(favicon(__dirname + '/public/favicon.ico')) //
Active la favicon indiquée
.use(function(req, res){ // Répond enfin
res.send('Hello');
});
ENI RV NodeJS et ExpressJS p.34
________________________________________________________________________________________________
app.listen(8080); Voici un exemple de chargement d’une série de
fonctions middleware sur un point de montage,
Une application Express peut utiliser les types de avec un chemin de montage. Il illustre une sous-
middleware suivants : pile de middleware qui imprime les infos de
demande pour tout type de demande HTTP
• Middleware niveau application adressée au chemin /user/:id.
• Middleware niveau routeur
• Middleware de traitement d’erreurs
• Middleware intégré app.use('/user/:id', function(req, res, next) {
• Middleware tiers console.log('Request URL:', req.originalUrl);
next();
Middleware niveau application }, function (req, res, next) {
console.log('Request Type:', req.method);
Liez le middleware niveau application à une next();
instance de l’objet app object en utilisant les });
fonctions app.use() et app.METHOD(), où
METHOD est la méthode HTTP de la demande
que gère la fonction middleware (par exemple Les gestionnaires de routage vous permettent de
GET, PUT ou POST) en minuscules. définir plusieurs routes pour un chemin. L’exemple
ci-dessous définit deux routes pour les demandes
Cet exemple illustre une fonction middleware sans GET adressées au chemin /user/:id. La deuxième
chemin de montage. La fonction est exécutée à route ne causera aucun problème, mais ne sera
chaque fois que l’application reçoit une demande. jamais appelée puisque la première route boucle
le cycle demande-réponse.
________________________________________________________________________________________________
app.get('/user/:id', function (req, res, next) {
// if the user ID is 0, skip to the next route // a middleware sub-stack that handles GET
if (req.params.id == 0) next('route'); requests to the /user/:id path
// otherwise pass the control to the next router.get('/user/:id', function (req, res, next) {
middleware function in this stack // if the user ID is 0, skip to the next router
else next(); // if (req.params.id == 0) next('route');
}, function (req, res, next) { // otherwise pass control to the next middleware
// render a regular page function in this stack
res.render('regular'); else next(); //
}); }, function (req, res, next) {
// render a regular page
// handler for the /user/:id path, which renders a res.render('regular');
special page });
app.get('/user/:id', function (req, res, next) {
res.render('special'); // handler for the /user/:id path, which renders a
}); special page
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id);
Middleware niveau routeur res.render('special');
});
Le middleware niveau routeur fonctionne de la
même manière que le middleware niveau // mount the router on the app
application, à l’exception près qu’il est lié à une app.use('/', router);
instance de express.Router().
Middleware de traitement d'erreurs
var router = express.Router();
Le middleware de traitement d’erreurs comporte
toujours quatre arguments plus particulièrement
Chargez le middleware niveau routeur par le biais avec la signature (err, req, res, next)) :
des fonctions router.use() et router.METHOD().
________________________________________________________________________________________________
Express fournit un middleware intégré })
express.static permettant de gérer des
fichiers statiques, tels que des images, Enregistrez le code ci-dessus dans un fichier
CSS, JavaScript, etc. nommé server.js et exécutez-le à l'aide de
la commande suivante.
Il vous suffit simplement de transmettre le nom du
répertoire dans lequel vous conservez vos $ node server.js
actifs statiques, au middleware
express.static pour commencer à servir Ouvrez maintenant
directement les fichiers. Par exemple, si http://127.0.0.1:8081/images/logo.png dans
vous conservez vos images, CSS et n’importe quel navigateur et observez le
JavaScript dans un répertoire nommé résultat suivant.
public, vous pouvez le faire -
app.use(express.static('public'));
node_modules
server.js
public/
public/images
public/images/logo.png
________________________________________________________________________________________________
var cookieParser = require('cookie-parser'); montés. Une instance Router est un middleware
et un système de routage complet . L’exemple
// load the cookie-parsing middleware suivant créé une routeur en tant que module,
app.use(cookieParser()); charge une fonction middleware, définit des routes
et monte le module de routeur sur un chemin dans
l’application principale.
app.get('/', function(req, res) {
Créez un fichier de routage nommé birds.js dans
console.log("Cookies: ", req.cookies) le répertoire app, avec le contenu suivant :
}) birds.js
index.js:
app.route('/book')
.get(function(req, res) { var birds = require('./birds');
res.send('Get a random book'); ...
}) app.use('/birds', birds);
.post(function(req, res) {
res.send('Add a book');
}) app.listen(3000);
.put(function(req, res) {
res.send('Update the book');
});
La demande /birds affichera le message 'Birds
home page’ et la demande /birds/about le
express.Router message 'About birds', et appeler la fonction
middleware timeLog spécifique à la route.
Utilisez la classe express.Router pour créer des
gestionnaires de route modulaires et pouvant être Routeurs
ENI RV NodeJS et ExpressJS p.38
________________________________________________________________________________________________
Définir les itinéraires comme ci-dessus est très things". Visitez localhost: 3000 / things / et vous
fastidieux à maintenir. Pour séparer les routes de verrez le résultat suivant.
notre fichier index.js principal, nous allons utiliser
Express.Router . Créez un nouveau fichier appelé
things.js et entrez-y le texte suivant.
things.js
});
});
//both index.js and things.js should be in same • la substitution de variables : remplacer, par
directory exemple « Bonjour #{name} » par
« Bonjour Jean » si la variable name vaut
app.use('/things', things); « Jean » ;
• l'utilisation de structures conditionnelles et
app.listen(3000); de boucles, dépendant notamment des
variables données en paramètre.
L' appel de la fonction app.use sur la route '/
things'' associe le routeur things à cette route. Il existe beaucoup d'autres langages de
Désormais, toutes les demandes de notre templates, comme Twig, Smarty, Haml, JSP,
application concernant les "/ things'' " seront
Jade, EJS...
traitées par notre routeur Things.js. Le "/" route
dans things.js est en fait une sous-route de "/
ENI RV NodeJS et ExpressJS p.39
________________________________________________________________________________________________
Le principe est le suivant : depuis votre fichier
JavaScript, vous appelez le template de votre //Creates a Root Route
choix en lui transmettant les variables dont il a app.get('/',function(req, res){
besoin pour construire la page. res.render('index'); //renders the index.jade file
into html and returns as a response. The render
function optionally takes the data to pass to the
view.
});
________________________________________________________________________________________________
« accueil.ejs ». Voici un exemple de fichier
expressions %> JavaScript operations
« accueil.ejs » minimal (page HTML) :
<h1><%= title %></h1> <!DOCTYPE html>
<ul>
<% for(var i=0; <html>
i<produits.length; i++)
{ %> <head>
<li>
<a href='produits /<%= <meta charset="utf-8" />
produits [i] %>'>
<title> TITRE </title>
<%= produits [i] %>
</a> </head>
</li>
<% } %> <body>
</body>
HTML-code <%= (...) Les tags
echappent HTML- </html>
%>
constructions
Ensuite, il faut faire appel à cette page dans le
Message:<br>
fichier app.js avec la commande res.render() qui
<input type="text"
va remplacer le res.send :
value="<%= message %>"
name="message" App.js
required>
var express = require('express');
<head>
<meta charset="utf-8"/>
Exemple1 Création d’une page en EJS
Par défaut, EJS stocke ses pages dans un sous- <title><%=title%></title>
dossier « views » de votre projet. Donc il faut
commencer par créer ce dossier, puis d’y créer <linkrel="stylesheet"href="/stylesheets/style.c
les pages à l’intérieur, dans un fichier ss"/>
ENI RV NodeJS et ExpressJS p.41
________________________________________________________________________________________________
<p> Voici <%= i%> canard. </p>
</head>
<% } else { %>
<body>
<p> Voici <%= i%> canards. </p>
<h1><%=title%></h1>
<% } %>
<p>Welcome to <%=message%></p>
<% } %>
</body>
</p>
</html>
Exemple 1 : <body>
<p> Vous avez <%= qte %> Canards. </p>
<% if (user) { %> </body>
________________________________________________________________________________________________
<h1>Vous êtes dans la chambre</h1>
<head>
<title>Page de test</title>
<meta charset="utf-8" />
</head>
________________________________________________________________________________________________
Il affiche la liste des données du tableau ainsi que
app.listen ( 3000 , function ( ) { les données de chaque élément du
console . log ( 'Server running at port 3000: tableau.
http://127.0.0.1:3000' ) ; Voici le format de travail de l'application.
}); - Le tableau users contient la liste des utilisateurs
avec leur nom d'utilisateur, leur âge et leur
Le modèle HTML pour EJS doit se trouver dans le adresse électronique.
dossier views . Donc, créez un nouveau - Chaque utilisateur est identifié par un ID
dossier nommé "views" puis créez un utilisateur particulier.
nouveau fichier nommé index.ejs dans le - Nous ne montrerons que le nom des utilisateurs
dossier "views". en page d'accueil.
- Nous mettrons un lien "Afficher les détails" à
Nous devons créer le fichier de modèle avec le côté du nom de chaque utilisateur dans la
nom index.ejs car nous avons spécifié liste des utilisateurs de la page d'accueil.
«index» comme nom de fichier dans le - Nous afficherons les détails de chaque utilisateur
code ci-dessus lors du rendu de la (nom, âge, email) sur la page "Afficher les
réponse. détails".
________________________________________________________________________________________________
<head >
// for users list page <title> All Users </title>
app.get ( '/users' , function ( request , response ) { </head>
/** <body>
* render to views/users.ejs template file <h1> All Users </h1>
* usersList is set to users variable <div >
*/ <!--
response.render ( 'users' , { users : usersList } ) Using FOREACH LOOP for the users
; array
});
// myArray.forEach( function ( el , index )
// for individual user page {
app.get ( '/user/:id' , function ( request , response ) // el - current element, i - index
{ });
/** -->
* Get the individual user details using request <% users.forEach( function ( user )
param ID { %>
* < p > <%=user.name %> <a
* We use array.filter() function for this purpose href='/user/ <%=user.id %> ' > View
* Details </a> </p>
* filter() is a Javascript function that creates a <% } ) %>
new array with elements </div >
* that satisfies the conditions present in the </body >
callback function </html >
*/ views / user.ejs
var singleUser = usersList.filter ( function ( user <html>
){ <head>
console.log (user.id ) ; return user.id == <title> Single User </title >
request.params.id } ) ; </head >
/** <body >
* The filter creates a new array with single user <h1> User Details </h1 >
element <div>
* Hence, getting the value of the first and only <p> Name : <%=name %> </p>
element <p> Age : <%=age %> </p>
*/ <p> Email : <%=email %> </p>
var singleUser = singleUser [ 0 ] ; </div>
</body>
/** </html>
* render to views/user.ejs template file
* name, age & email variables are passed to Node.js & Express: Routage et application à
the template page unique (SPA)
*/
response . render ( 'user' , { Le code ci-dessous montre un exemple simple
name : singleUser.name , d'utilisation de la fonctionnalité de routage
age : singleUser.age , de base dans Express. La méthode HTTP
email : singleUser.email GET est utilisée pour inclure différents
}); fichiers HTML. Dans la réponse, la
}); méthode sendFile est utilisée pour
transmettre les fichiers HTML au
app.listen ( 3000 , function ( ) { navigateur. Le serveur d'applications
console.log ( 'Server running at port 3000: écoute le port 3000 .
http://127.0.0.1:3000' ) ;
}); app.js
________________________________________________________________________________________________
app . get ( '/' , function ( request , response ) { <h1> Contact Us </h1>
// This is contact page.
response.send('<h1>Homepage</h1><div </body>
>This is homepage.</div>'); // you can also </html>
directly write HTML content
response . sendFile ( __dirname + '/index.html' Maintenant, allez dans le répertoire de votre projet
); de noeud et exécutez la commande
}); suivante dans terminal / command-prompt:
Voici l'exemple des fichiers index.html , about.html Utilisation des formulaires et récupération des
et contact.html : résultats
contact.html
<html>
<head>
<title> Contact Us </title>
</head>
<body>
ENI RV NodeJS et ExpressJS p.46
________________________________________________________________________________________________
password : 'MonMotDePasse',
database : 'MaBaseDeDonnees'
});
connection.connect(function (err) {
});
if (!err) {
};
});
host : 'localhost',
________________________________________________________________________________________________
var query = connection.query(querystring, function product_price int ,
(err, rows, fields) {
) ENGINE=INNODB;
if (!err) {
console.log(fields);
};
});
mkdir crud
>Controllers
cd crud
product
npm init –yes pour initialiser le projet avec le
fichier package.json
index.js
Etape 2 : Installer les modules nécessaires.
//use path module
npm install express -save
const path = require('path');
npm install body-parser –save // pour parse
requête JSON et permettre d’accéder à a //use express module
req.body dans des routes.
const express = require('express');
npm install ejs –save // pour le moteur de
template EJS (Embedded Javascript Templating) //use hbs view engine
npm install mysql –save // pour module mysql //const hbs = require('hbs');
________________________________________________________________________________________________
/* //app.use('/product',product) ;
res.render('product_view',{
});
//set views file let sql = "INSERT INTO product SET ?";
res.redirect('/');
app.use(bodyParser.json()); });
app.use(express.static("public"));
ENI RV NodeJS et ExpressJS p.49
________________________________________________________________________________________________
let sql = "UPDATE product SET
product_name='"+req.body.product_name+"',
product_price='"+req.body.product_price+"' var express=require('express');
WHERE product_id="+req.body.id;
// var app =express();
let query = conn.query(sql, (err, results) => {
const app = express.Router();
if(err) throw err;
const mysql = require('mysql');
res.redirect('/');
});
//Create connection
});
const conn = mysql.createConnection({
host: 'localhost',
//route for delete data
user: 'root',
app.post('/delete',(req, res) => {
password: 'root',
let sql = "DELETE FROM product WHERE
product_id="+req.body.product_id+""; database: 'base'
if(err) throwerr;
app.listen(8000, () => {
Controllers res.render('product_view',{
// controller });
ENI RV NodeJS et ExpressJS p.50
________________________________________________________________________________________________
}); let sql = "DELETE FROM product_express
WHERE product_id="+req.body.product_id+"";
});
let query = conn.query(sql, (err, results) => {
if(err) throwerr;
res.redirect('/');
//route for insert data
});
app.post('/save',(req, res) => {
});
let data = {product_name:
req.body.product_name, product_price:
req.body.product_price};
module.exports = app;
let sql = "INSERT INTO product_express SET ?";
views
let query = conn.query(sql, data,(err, results) => {
res.redirect('/');
});
});
<body>
//route for delete data
<div class="container">
app.post('/delete',(req, res) => {
ENI RV NodeJS et ExpressJS p.51
________________________________________________________________________________________________
<center> <h2>CRUD PRODUCTS WITH </tr>
EXPRESS JS</h2></center>
<%})%>
<button class="btn btn-success" data-
toggle="modal" data-target="#myModalAdd">Add <%}%>
New</button>
</tbody>
<table class="table table-striped" id="mytable">
</table>
<thead>
</div>
<tr>
<th>Product ID</th>
<!-- Modal Add Product-->
<th>Product Name</th>
<form action="/save" method="post">
<th>Price</th>
<div class="modal fade" id="myModalAdd"
<th>Action</th> tabindex="-1" role="dialog" aria-
labelledby="exampleModalLabel" aria-
</tr> hidden="true">
</button>
<td> </div>
</td>
ENI RV NodeJS et ExpressJS p.52
________________________________________________________________________________________________
<div class="form-group"> </div>
</button>
ENI RV NodeJS et ExpressJS p.53
________________________________________________________________________________________________
<div class="modal fade" id="DeleteModal" $(document).ready(function(){
tabindex="-1" role="dialog" aria-
labelledby="myModalLabel" aria-hidden="true"> //showing data to edit modal
<div class="modal-dialog"> $
('#mytable').on('click','.edit',function(){
<div class="modal-content">
var product_id = $(this).data('id');
<div class="modal-header">
var product_name = $
<h5 class="modal-title" (this).data('product_name');
id="myModalLabel">Delete Product</h5>
var product_price = $
<button type="button" class="close" (this).data('product_price');
data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button> $('#EditModal').modal('show');
</div> $('.product_name').val(product_name);
</div>
});
</div>
</script>
</div>
</body>
</div>
</html>
</form>
product_view.hbs
<script src="/assets/js/jquery.min.js"></script>
<script src="/assets/js/bootstrap.js"></script>
<htmllang="en">
<script>
ENI RV NodeJS et ExpressJS p.54
________________________________________________________________________________________________
<head> <a href="javascript:void(0);" class="btn
btn-sm btn-info edit" data-id="{{ product_id }}"
<meta charset="utf-8"> data-product_name="{{ product_name }}" data-
product_price="{{ product_price }}">Edit</a>
<title>CRUD Node.js and Mysql</title>
<a href="javascript:void(0);" class="btn
<!-- <link href="/assets/css/bootstrap.css" btn-sm btn-danger delete" data-
rel="stylesheet"type="text/css"/>--> id="{{ product_id }}">Delete</a>
________________________________________________________________________________________________
<input type="text" <button type="button" class="close" data-
name="product_name" class="form-control" dismiss="modal" aria-label="Close">
placeholder="Product Name" required>
<span aria-
</div> hidden="true">×</span>
</button>
________________________________________________________________________________________________
<!-- Modal Delete Product--> <script src="/assets/js/jquery.min.js"></script>
</div> });
</div> });
</div> </script>
</div> </body>
</form> </html>
Demarrer le serveur
ENI RV NodeJS et ExpressJS p.57
________________________________________________________________________________________________
node index
Après Save
Après Edit
________________________________________________________________________________________________
Dans le controller user.js , on doit importer API
check pour utiliser les fonctions de validation
Delete avec boite de confirmation : ( Longueur de champ, type mail , type numérique
etc..) .
• isLength()
• isEmail()
• isNumeric()
• contains(), verifie si la valeur contient la
valeur spécifiée
• equals(),verifie si la valeur est équale à la
valeur spécifiée
• isAlpha()
• isAlphanumeric()
• isBoolean()
user.js
ENI RV NodeJS et ExpressJS p.59
________________________________________________________________________________________________
const express = require ('express'); const errors = validationResult (req);
}
// on peut personnaliser le message d’erreur avec // ajouter dans la base de données
withMessage():
});
check('name')
.isAlpha()
.withMessage('Must be only alphabetical Chaque fois qu'une demande contenant des
chars') champs de nom d'utilisateur ou de mot de passe
invalides est soumise, le serveur répond comme
.isLength({ min: 10 })
ceci:
.withMessage('Must be at least 10 chars
long') , {
"les erreurs": [{
"emplacement": "corps",
check ('email'). isEmail (),
"msg": "Valeur non valide",
// le mot de passe doit contenir au moins 5
caractères
"param": "nom d'utilisateur"
check ('motdepasse'). isLength ({min: 5}),
}]
check('age').isNumeric()
}
], (req, res) => {
________________________________________________________________________________________________
user.js
check('email', 'Your email is not
valid').not().isEmpty(),
const express = require ('express');
// check('email', 'Your email is not
const app = express ();
valid').not().isEmpty().isEmail().normalizeEmai
l(),
check('name').not().isEmpty().withMessage(
// check('password', 'Your password must be
'Name must have more than 5 characters'),
at least 5
characters').not().isEmpty().isLength({min: 5}),
//
check('name').not().isEmpty().isLength({min:
],
5}).withMessage('Name must have more than
function (req, res) {
5 characters'),
console.log(req.body);
check('classYear', 'Class Year should be a
number').not().isEmpty(),
if (!errors.isEmpty()) {
}
// check('weekday', 'Choose a
weekday').optional().not().isIn(['Sunday', });
'Saturday']),
ENI RV NodeJS et ExpressJS p.61
________________________________________________________________________________________________
valid').not().isEmpty().isEmail().normalizeEmai
Au niveau validateur
l(),
Lorsque vous souhaitez contrôler avec précision
le message d'erreur de chaque validateur, vous
pouvez le spécifier à l'aide de la méthode
.withMessage ().
________________________________________________________________________________________________
.matches (/ \ d /). withMessage ('doit contenir avec le message Le mot de passe doit être
un nombre') composé de 5 caractères et contenir un
nombre, car ces validateurs n'ont pas spécifié
], (req, res) => { un message qui leur est propre.
Les messages peuvent être spécifiés au niveau Etape 2 : Installer les modules nécessaires.
du champ en utilisant le deuxième paramètre des
middlewares de validation. npm install express -save
Ces messages sont utilisés comme repli lorsqu'un
npm install express-validator -save // utilisé pour
validateur ne spécifie pas son propre message:
validation de formulaire
const {check} = require ('express-validator');
npm install body-parser –save // pour parse
app.post ('/ user', [ requête JSON et permettre d’accéder à a
req.body dans des routes.
// ... quelques autres validations ...
npm install method-override –save // pour passer
check ('mot de passe', 'Le mot de passe doit des données avec les requetes comme PUT et
contenir au moins 5 caractères et contenir un DELETE
nombre')
npm install express-flash-save // utilisé pour
.not (). isIn (['123', 'password', 'god']). afficher des messages après insertion ou
withMessage ('N'utilisez pas un mot commun suppression d’enregistrement.
comme mot de passe')
Dans l'exemple ci-dessus, lorsque le champ du npm install mysql –save // pour module mysql
mot de passe est inférieur à 5 caractères ou
ne contient pas de nombre, il sera signalé
ENI RV NodeJS et ExpressJS p.63
________________________________________________________________________________________________
Le module express-myconnection est utilize pour
MySQL connection.
use node_crud_mysql_ejs;
Views : Index.ejs, add.ejs , edit.ejs
CREATE TABLE students(
id int(11)NOTNULLauto_increment,
first_name varchar(100)NOTNULL,
last_name varchar(100)NOTNULL,
); var app=express();
var mysql=require('mysql');
var bodyParser=require('body-parser');
node_crud_mysql_ejs
var flash=require('express-flash');
var cookieParser=require('cookie-parser');
var session=require('express-session');
var methodOverride=require('method-override');
var expressValidator=require('express-validator');
var config=require('./config');
var students=require('./controllers/student');
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
ENI RV NodeJS et ExpressJS p.64
________________________________________________________________________________________________
app.use(cookieParser('keyboard cat')); return method;
app.use(session({ }
secret:'venot123', }));
resave:false, app.use('/',students);
saveUninitialized:true, app.listen(3000,function(){
Controllers
var dbOptions={
Student.js
host: config.database.host,
var express=require('express');
user: config.database.user,
var router =express();
password:config.database.password,
var dateTime=require('node-datetime');
port: config.database.port,
var dt=dateTime.create();
database:config.database.db
var curdate=dt.format('Y-m-d H:M:S');
app.use(myConnection(mysql,dbOptions,'pool'));
const{check,validationResult}=require('express-
app.set('view engine','ejs'); validator');
app.use(express.static("public")); req.getConnection(function(error,conn){
if(err){
app.use(methodOverride(function(req,res){ res.render('index',{
________________________________________________________________________________________________
title:' DEMO CRUD ETUDIANTS check('txtMobile').not().isEmpty().withMessage('
AVEC EXPRESSJS', Mobile is Required Field')
data:rows, ],
errors:'' function(req,res){
} if(!errors.isEmpty()){
}); res.render('add',{
}); errors:errors.array(),
router.get('/add',function(req,res,next){ txtFname:req.body.txtFname,
res.render('add',{ txtLname:req.body.txtLname,
errors:'', txtMobile:req.body.txtMobile
txtFname:'', });
txtLname:'', }else{
txtEmail:'',
}) first_name:req.body.txtFname.trim(),
}); last_name:req.body.txtLname.trim(),
email:req.body.txtEmail.trim(),
router.post('/add',[ created_at:curdate
check('txtFname').not().isEmpty().withMessage( }
'First Name is Required Field'),
check('txtLname').not().isEmpty().withMessage(
'Last Name is Required Field'), req.getConnection(function(error,conn){
________________________________________________________________________________________________
req.flash('success','Data added errors:'',
successfully!')
id:rows[0].id,
res.render('add',{
txtFname:rows[0].first_name,
title:'Add New Student',
txtLname:rows[0].last_name,
errors:'',
txtEmail:rows[0].email,
txtFname:'',
txtMobile:rows[0].mobile,
txtLname:'',
created_at:curdate
txtEmail:'',
});
txtMobile:''
}
});
});
});
});
});
});
}
//following route to the edit student data
});
router.put('/edit/(:id)',[
check('txtFname').not().isEmpty().withMessage(
//following route to the show edit form student data 'First Name is Required Field'),
check('txtLname').not().isEmpty().withMessage('L
router.get('/edit/(:id)',function(req,res,next){ ast Name is Required Field'),
check('txtEmail').isEmail().normalizeEmail().withM
req.getConnection(function(error,conn){ essage('Email is Not Valid'),
check('txtMobile').not().isEmpty().withMessage('M
conn.query('SELECT * FROM students WHERE obile is Required Field')
id = '+req.params.id,function(err,rows,fields){
],
if(rows.length<=0){
function(req,res){
req.flash('error','Student not found with
id = '+req.params.id); const errors=validationResult(req);
res.redirect('/');
} if(!errors.isEmpty()){
else{ res.render('edit',{
res.render('edit',{ errors:errors.array(),
________________________________________________________________________________________________
id:req.params.id, });
txtFname:req.body.txtFname, });
txtLname:req.body.txtLname, }
txtEmail:req.body.txtEmail, });
txtMobile:req.body.txtMobile
}else{ router.delete('/delete/(:id)',function(req,res,next){
first_name:req.body.txtFname.trim(),
last_name:req.body.txtLname.trim(), req.getConnection(function(error,conn){
} if(err){
req.getConnection(function(error,conn){ res.redirect('/');
res.render('edit',{ }
errors:'', });
id:req.params.id, });
txtFname:req.body.txtFname, module.exports=router;
txtLname:req.body.txtLname,
txtEmail:req.body.txtEmail, views
txtMobile:req.body.txtMobile index.ejs
<html lang="en">
ENI RV NodeJS et ExpressJS p.68
________________________________________________________________________________________________
<head> <div class="row">
<script <thead>
src="/assets/js/jquery.min.js"></script>
<tr>
<script src="/assets/js/bootstrap.min.js"></script>
<th>FirstName</th>
<th>LastName</th>
</head>
<th>Email</th>
<body>
<th>Mobile</th>
<th>Action</th>
<!-- <h1><%=title%></h1> -->
</tr>
<div class="container"style="margin-top: 50px;">
</thead>
<% if(errors){%>
<tbody>
<ul class="alert alert-danger">
<% if(data){%>
<% for(var i=0;i<errors.length;i++){%>
<% data.forEach(function(student){%>
<li><%=errors[i].msg%></li>
<tr>
<%}%>
<td><%=student.first_name%></td>
</ul>
<td><%=student.last_name%></td>
<%}%>
<td><%=student.email%></td>
<% if(messages.success){%>
<td><%=student.mobile%></td>
<div class="alert alert-success">
<td>
<strong>Success!</strong><%-
messages.success%> <div style="float:left">
________________________________________________________________________________________________
<input type="submit" name="delete" </head>
value='Delete' class="btn btn-danger"
onClick="return confirm('Are you sure you want to <body>
delete?')"/>
<div class="container"style="margin-top: 50px;">
<input type="hidden" name="_method"
value="DELETE"/> <%if(errors){%>
</div> <%for(vari=0;i<errors.length;i++){%>
</td> <li><%=errors[i].msg%></li>
</tr> <%}%>
<%})%> </ul>
<%}%> <%}%>
</tbody> <%if(messages.success){%>
</div> <strong>Success!</strong><%-
messages.success%>
</body>
</div>
</html>
<%}%>
Add.ejs
<div class="row">
<!DOCTYPE html>
<div class="col-lg-10 text-center"><h3><%=title
<html lang="en"> %></h3></div>
________________________________________________________________________________________________
<input type="text" name="txtFname" <div class="col-sm-offset-2 col-sm-10">
class="form-control" id="txtFname" value="<
%=txtFname%>"/></td> <button type="submit" class="btn btn-
primary">Add</button>
</div>
</div>
</div>
</div>
<div class="form-group">
</form>
<label class="control-label col-sm-2"
for="txtLname">First Name:</label>
</div>
</div> Edit.ejs
________________________________________________________________________________________________
<li><%=errors[i].msg%></li> <label class="control-label col-sm-2"
for="txtLname">First Name:</label>
<%}%>
<div class="col-sm-10">
</ul>
<input type="text" name="txtLname"
<%}%> class="form-control" id="txtLname" value="<
%=txtLname%>"/></td>
</div>
<%if(messages.success){%>
</div>
<div class="alert alert-success">
<div class="form-group">
<strong>Success!</strong><%-
messages.success%> <label class="control-label col-sm-2"
for="txtEmail">Email:</label>
</div>
<div class="col-sm-10">
<%}%>
<input type="email" name="txtEmail"
<div class="row"> class="form-control" id="txtEmail" value="<
%=txtEmail%>"/></td>
<div class="col-lg-10 text-center"><h3><%=title
%></h3></div> </div>
</div> </div>
</div> </div>
________________________________________________________________________________________________
</div>
</body>
</html>
________________________________________________________________________________________________
CREATETABLE product(
product_id INT(11)
PRIMARYKEYAUTO_INCREMENT,
product_name VARCHAR(200),
product_price INT(11)
)ENGINE=INNODB;
INSERT INTO
product(product_name,product_price) VALUES
('Product 1','2000'),
('Product 2','5000'),
('Product 3','4000'),
('Product 4','6000'),
('Product 5','7000');
fichier package.json
{
"name": "restful-api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "M Fikri",
"license": "ISC",
"dependencies": {
Etape #2. Creer une base de données MYsql "body-parser": "^1.18.3",
restful_db et une table product "express": "^4.16.4",
"mysql": "^2.16.0"
CREATEDATABASE restful_db;
ENI RV NodeJS et ExpressJS p.74
________________________________________________________________________________________________
} CORS (le caractère générique * permet
} l'accès depuis n'importe quelle origine
# app.js
index.js
________________________________________________________________________________________________
// res.send(JSON.stringify({"status": 200, "error": });
null, "resultat": results}));
return res.send(JSON.stringify({"status": 200, //Server listening
"error": null, "resultat": results})); app.listen(3000,() =>{
// return res.send({"status": 200, "error": null, console.log('Server started on port 3000...');
"resultat": results});
// return res.send(results); });
//update product
app.put('/api/products/:id',(req, res) => {
let sql = "UPDATE product SET
product_name='"+req.body.product_name+"',
#1. Obtenir tous les produits Get All Products
product_price='"+req.body.product_price+"'
(GET)
WHERE product_id="+req.params.id;
let query = conn.query(sql, (err, results) => {
Ouvrir POSTMAN, et taper l’URL suivant dans
if(err) throwerr;
Postman URL
res.send(JSON.stringify({"status": 200, "error":
:
null, " resultat ": results}));
http://localhost:3000/api/products
});
});
Selectionner la methode "GET", et cliquer sur le
bouton Send , et les resultats
//Delete product
app.delete('/api/products/:id',(req, res) => {
let sql = "DELETE FROM product WHERE
product_id="+req.params.id+"";
let query = conn.query(sql, (err, results) => {
if(err) throwerr;
res.send(JSON.stringify({"status": 200, "error":
null, " resultat ": results}));
});
ENI RV NodeJS et ExpressJS p.76
________________________________________________________________________________________________
________________________________________________________________________________________________
________________________________________________________________________________________________
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
HttpURLConnectionExample http =
new HttpURLConnectionExample();
System.out.println("GET Request
Using HttpURLConnection");
http.sendGet();
}
HttpURLConnection con =
<?php (HttpURLConnection) obj.openConnection();
$url ="http://localhost:3000/api/products'"; con.setRequestMethod("GET");
con.setRequestProperty("Accept-
// pass the java restful URL Charset", "UTF-8");
$client = curl_init($url); System.out.println("Response Code
curl_setopt($client,CURLOPT_RETURNTRANSF : " + con.getResponseCode());//200
ER,1); System.out.println("Response
$response = curl_exec($client); Message : " + con.getResponseMessage());// OK
//$result = json_decode($response);
if(!empty($response)) BufferedReader in = new
{ BufferedReader(
echo $response; new
} InputStreamReader(con.getInputStream()));
else String line;
{ StringBuffer response = new
echo "No data found"; StringBuffer();
}
?> while ((line = in.readLine()) != null)
{
response.append(line);
CLIENT JAVA }
in.close();
import java.io.BufferedReader;
import java.io.DataOutputStream;
ENI RV NodeJS et ExpressJS p.79
________________________________________________________________________________________________
<td><button type="button" name="edit"
System.out.println(response.toString()); class="btn btn-primary btn-xs edit"
@click="fetchData(contact.id)">Edit</button></td>
} <td><button type="button" name="delete"
class="btn btn-danger btn-xs delete"
} @click="deleteData(contact.id)">Delete</button><
/td>
CLIENT VUEJS
</tr>
</table>
<!DOCTYPE html>
<html lang="en"> </div>
<head> </div>
<meta charset="UTF-8"> </div>
<link rel="stylesheet" type="text/css"
href="css/bootstrap.min.css"/> <script>
<script src="js/vue.min.js"></script> var app = new Vue({
<script src="js/axios.min.js"></script> el: '#vueapp',
<script type="text/javascript" data: {
src="js/bootstrap.min.js"></script> name: '',
</head> email: '',
<body> country: '',
city: '',
<!-- Content Section -->> job: '',
<div class="row"> contacts: []
<div class="col-md-12"> },
<h1>Demo: VueJS and MySQL CRUD mounted: function () {
Operations using ExpressJs</h1> console.log('Hello from Vue!');
</div> this.getContacts();
</div> },
<div class="row" > methods: {
<div class="col-md-12"> getContacts: function(){
<div class="pull-right">
<button class="btn btn-success" data- axios.get('http://localhost:3000/api/products'')
toggle="modal" data- .then(function (response) {
target="#add_new_record_modal">Add New // console.log(response.data);
Record</button> // alert(" Message:
</div> "+response.data.status);
</div> app.contacts = response.data.resultat;
</div>
<div class="row" id='vueapp'> })
<div class="col-md-12"> .catch(function (error) {
<h3>Records:</h3> console.log(error);
<table class="table table-bordered table- });
striped"> }
<tr>
<th>Name</th> }
<th>Email</th> })
</script>
</tr> </body>
</html>
<tr v-for='contact in contacts'>
<td>{{ contact.name }}</td>
<td>{{ contact.email }}</td>
ENI RV NodeJS et ExpressJS p.80
________________________________________________________________________________________________
III-A. Prérequis
________________________________________________________________________________________________
________________________________________________________________________________________________
On choisira alors dans l'assistant « Node.js Notre projet est alors créé. Nous pouvons
Project » : d'ailleurs le constater dans l'explorateur de projet :
________________________________________________________________________________________________
Une application node.js est testable directement • https://github.com/expressjs/body-parser
dans Eclipse. Pour le montrer, nous allons tester • https://github.com/expressjs/multer/
notre projet sampleNode. • http://naltatis.github.io/jade-syntax-
docs/#basics
Pour ce faire, il suffit de faire un clic droit sur le • https://developer.mozilla.org/en-
fichier hello-world-server.js dans l'explorateur de US/docs/Learn/Server-
projet et de choisir de l'exécuter comme node side/Express_Nodejs/Introduction
application : Express/Node introduction
• https://nodejs.org/en/docs/ About
documentation
• https://developer.ibm.com/languages/node
-js/tutorials/learn-nodejs-expressjs/
Using Express.js for Node applications
Liens
• http://en.wikipedia.org/wiki/Node.js
• http://openclassrooms.com/courses/des-
applications-ultra- rapides-avec-node-js
• http://expressjs.com/4x/api.html