Avec les années le javascript a évolué à travers différents frameworks, principalement front-end. Mais aujourd’hui javascript permet le développement back-end notamment via Node.js, Express et MangoDB.
NPM
Pour utiliser le runtime node, qui permettra de gérer les instructions côté serveur (logique métier, persistance des données, sécurité etc.), il pour cela installer toutes ses dépendance. Cela passe par le Node Package Manader, CLI destiné à initialisé un projet node (notamment).
npm init
Une bonne pratique est toutefois, afin de travailler en local, d’exécuter npm init dans un dossier /backend à la racine du projet, tandis que l’on mettra nos fichiers front dans un dossier /frontend. Dans ce dernier dossier, il sera nécessaire (après avoir placer les fichiers) d’exécuter npm install qui installera les dépendances requises.
Lancer le server
Dans le dossier backend, il faut que le fichier index.js contienne cela :
//Import du package HTTP de node
const http = require('http');
//Initialisation du serveur et traitement de la réponse
const server = http.createServer(HandleRequests);
//Fonction qui gère le retour du serveur (request, response)
function HandleRequests(req, res) {
res.end("Resultat renvoyé par le serveur");
}
//On demande au serveur d'écouter ce qui va arriver sur le port définit par l'environnement, ou sur le 3000 par défaut
server.listen(process.env.PORT || 3000);
Ensuite, lancer le server via la ligne de commande :
node server
Le serveur étant lancé, effectuer une requête GET via un navigateur (exemple : http://localhost:3000/param=1) ou en utilisant un outil spécifique tel que POSTman. Le server devrait invariablement renvoyé :
Résultat renvoyé par le serveur


Simplifier avec Nodemon
Nodemon est un « utilitaire » permettant de redemarrer le serveur à chaque changement de fichier (et donc permet de ne pas avoir à le faire manuellement).
Pour l’installer faire npm install -g nodemon, et pour lancer le serveur une premiere fois faire nodemon server (au lieu de node server).
Attention : il se peut qu’une politique de sécurisation d’execution des scripts empêche nodemon server de fonctionner (car execute un fichier .ps1). Il faut donc ajuster les permissions d’execution des script de l’ordinateur en executant un invité de commande en Administrateur et en saisissant
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
S’agissant d’un risque de sécurité, je laisse à chacun le plaisir de remplacer <PolicyName> par la valeur adéquaté (voir deuxième lien dans les sources).
Express
Il faut maintenant installer express qui servira notamment à gérer les serveurs nodes et à se préoccuper de tout ce qui concerne la couche middleware.
npm install express --save
Une fois installé, créer un fichier app.js pour initialiser l’application express
const express = require('express');
//Création de l'application Express
const app = express();
//On inclut la constante pour qu'on puisse l'utiliser depuis le rester du projet : notamment via le serveur node
module.exports = app;
Cas pratique
En réalité le fichier server.js (ou index.js) ne prendra pas en charge les fonctions de retour (HandleRequest) : il utilisera l’objet « app » (exporté et donc devenu package) pour prendre en charge cette objectifs.
App.js, concernant l’application Express, prendra en charges les fonctions middlesware qui analyseront les requêtes et renverront les réponses au navigateurs.
App.js
Son rôle, à travers les fonctions middleware est de traiter les requetes, les analyser, requêter la BD et renvoyer l’information nécessaire.
const express = require('express');
//Création de l'application Express
const app = express();
//Fonction MiddleWare N°1 : prise en charge de la requête
app.use((req, res, next) => {
console.log("Réception d'une requete Http");
next(); //Go to function middleware N°2
})
//Fonction MiddleWare N°2 : définitions des CORS pour TOUTES les requetes
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content, Accept, Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
next();
});
//Fonction MiddleWare N°3 : Envoie d'une réponse
app.get('/api/motcle', (req, res, next) => {
const stuff = [
{
_id: 'oeihfzeoi',
title: 'Mon premier objet',
description: 'Les infos de mon premier objet'
},
{
_id: 'oeihfzeomoihi',
title: 'Mon deuxième objet',
description: 'Les infos de mon deuxième objet'
},
];
res.status(200).json(stuff);
});
//Fonction MiddleWare N°4 : Log du résultat
app.use((req, res) => {
console.log('Réponse envoyée avec succès !');
});
//On inclut la constante pour qu'on puisse l'utiliser depuis le rester du projet : notamment via le serveur node
module.exports = app;
Server.js
//Import du package HTTP de node (système de module CommonJS)
const http = require('http');
const app = require("./app");
//Fonction utilitaire pour s'assurer de renvoyer un port au format numérique
function NormalizePort(val) {
const port = parseInt(val, 10);
if (isNaN(port)) {
return val;
}
if (port >= 0) {
return port;
}
return false;
};
const port = NormalizePort(process.env.PORT || '3000');
app.set('port', port);
//Gestion des erreur de connexion au serveur
const errorHandler = error => {
if (error.syscall !== 'listen') {
throw error;
}
const address = server.address();
const bind = typeof address === 'string' ? 'pipe ' + address : 'port: ' + port;
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges.');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use.');
process.exit(1);
break;
default:
throw error;
}
};
//Gestion de de l'après-fonctionnement du serveur
const listeningHandler = () => {
const address = server.address();
const bind = typeof address === 'string' ? 'pipe ' + address : 'port ' + port;
console.log('Listening on ' + bind);
}
//Initialisation du serveur
const server = http.createServer(app);
//Configuration des function onError et onListening
server.on('error', errorHandler);
server.on('listening', listeningHandler);
server.listen(port);
Sources
- https://openclassrooms.com/fr/courses/6390246-passez-au-full-stack-avec-node-js-express-et-mongodb/6466231-demarrez-votre-serveur-node
- https://docs.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2