đ©âđ« Express 101 : part of your symphony
Objectifs
- Découvrir Express.js et comprendre son rÎle dans le développement d'applications web.
- Créer une application avec Express.js.
Pré-requis
- 1
Valider les quĂȘtes suivantes
QuĂȘtes liĂ©es - 2
Garder en tĂȘte la notion de callback
Une fonction de rappel (callback) est une fonction passée en paramÚtre d'une autre fonction.
Par exemple, dans cet extrait de code,
handleClickest un callback :javascriptfunction handleClick() { alert("you clicked!"); } button.addEventListener("click", handleClick); - 3
Identifier le callback dans cet extrait de code
javascriptfunction sayGoodBye() { console.log("Goodbye!"); } greet("Alice", sayGoodBye);Voir la solution
La fonction
sayGoodByeest le callback. Dans cet exemple, la fonctionsayGoodByeest exécutée par la fonctiongreet.
Sommaire
L'architecture client-serveur du web
Tu as peut-ĂȘtre dĂ©jĂ vu un schĂ©ma de ce genre ?

Il reprĂ©sente l'architecture client-serveur du web : le client web (navigateur web, mobile...) envoie une requĂȘte HTTP Ă un serveur web ; le serveur web traite la requĂȘte et retourne une rĂ©ponse HTTP (le contenu HTML d'une page par exemple).
Cette représentation est un peu simple, et ne montre pas la place des différents outils comme React notamment. Je te propose une version alternative :

Dans ce schéma, le client web est constitué de 2 "parties" :
- React qui permet de produire un affichage, et de capter les interactions de l'utilisateur.
- Une brique qui permet de communiquer avec l'extĂ©rieur, Ă travers le systĂšme de requĂȘte/rĂ©ponse HTTP. Ici, c'est la fonction
fetchqui est une API pour effectuer des requĂȘtes HTTP cĂŽtĂ© client.
Le serveur web est constitué de 2 "parties" :
- Un bloc Express, dont le but est de recevoir la requĂȘte HTTP et de remplir la rĂ©ponse HTTP pour son client.
- Les donnĂ©es, qui peuvent ĂȘtre stockĂ©es directement sur le serveur web, ou sur un autre serveur : un serveur de base de donnĂ©es.
Ce schéma présente une "stack", une chaine d'outils, parmi d'autres : tu pourrais utiliser d'autres outils à la place de React et d'Express.
Mais l'idée générale avec du code exécuté cÎté client et du code exécuté cÎté serveur existera toujours sous une forme ou une autre.
Quels que soient les outils, c'est la définition fondamentale du web. Cette architecture est utilisée dans les sites e-commerce, les réseaux sociaux... tous les sites que tu consultes chaque jour.
Lors du développement d'applications web et mobiles, comprendre l'interaction entre le client et le serveur est important. Cette compréhension permet de structurer efficacement les applications et d'optimiser les échanges de données.
L'architecture client-serveur est un modĂšle fondamental dans le dĂ©veloppement d'applications web, oĂč les clients font des requĂȘtes au serveur (REQUEST), qui traite ces requĂȘtes et renvoie les rĂ©ponses appropriĂ©es (RESPONSE).
Le RĂŽle du Client
Le client peut ĂȘtre un navigateur web, une application mobile, ou tout autre dispositif capable d'envoyer des requĂȘtes Ă un serveur. Le client est l'interface Ă travers laquelle tu interagis avec le web : sans lui, tu ferais tes requĂȘtes HTTP "Ă la main" dans un terminal avec ce genre de commandes :
curl https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal
La commande curl est aussi un exemple de client web. C'est l'équivalent en ligne de commande de la barre d'URL de ton navigateur.
Lorsqu'un utilisateur effectue une action nĂ©cessitant des donnĂ©es (par exemple, afficher une liste d'articles), le client envoie une requĂȘte au serveur pour obtenir ces donnĂ©es.
Le RĂŽle du Serveur
Le serveur est responsable de la rĂ©ception des requĂȘtes du client, et de l'envoi des rĂ©ponses au client. Pour produire une rĂ©ponse, le serveur exĂ©cutera une action "sur mesure" en fonction de la requĂȘte. Cette action peut impliquer d'interroger une base de donnĂ©es par exemple.
Le serveur web agit comme un intermédiaire entre le client et le web, s'assurant que les bonnes actions sont déclenchées, et de maniÚre sécurisée.
Si tu souhaites en savoir plus sur les serveurs web :
Qu'est-ce qu'un serveur web ?
Zoom sur Express
Express est la piÚce du puzzle qui nous intéresse aujourd'hui :

Express.js (ou plus simplement Express) est un framework minimaliste pour Node.js qui permet de créer des applications web et des APIs en JavaScript.
Express simplifie le dĂ©veloppement de code serveur en gĂ©rant les requĂȘtes HTTP et en intĂ©grant de nombreux outils pour tracer le chemin entre la requĂȘte et la rĂ©ponse. Cela inclut analyser les URLs, choisir les routes appropriĂ©es...
Pourquoi utiliser Express ?
-
Simplicité et flexibilité : Express offre une approche minimaliste du développement web, te permettant de choisir les outils et les bibliothÚques que tu souhaites intégrer.
-
Rapidité de développement : grùce à sa structure minimaliste, tu peux mettre en place une API robuste en quelques lignes de code.
-
Communauté et support : c'est l'un des frameworks les plus utilisés dans l'écosystÚme
node, et il bénéficie d'une grande communauté et d'une vaste gamme de ressources d'apprentissage. -
Performances : Express est conçu pour offrir une gestion efficace des requĂȘtes et des rĂ©ponses HTTP.
Créer une application Express
Tu peux suivre la documentation d'Express pour te familiariser avec ses explications : c'est la ressource de rĂ©fĂ©rence oĂč tu trouveras les meilleures infos Ă jour. Tu peux aussi continuer Ă lire cette quĂȘte si tu le souhaites.
- 1
Créé un nouveau répertoire
Créé un nouveau répertoire pour contenir ton application, et déplace-toi dedans :
mkdir hello-express cd hello-express - 2
Initialise un module
Créé un fichier
package.jsonpour ton application :npm init -yAjoute la propriété
"type": "module"dans tonpackage.json:diff{ "name": "hello-express", + "type": "module", "version": "1.0.0", "main": "index.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "description": "" }Pour rappel, c'est cette ligne qui te permet d'utiliser les instructions
importetexportĂ la place des syntaxes CommonJSrequireetmodule.exports. - 3
Installe Express (et d'autres choses)
Via
npmen utilisant la commande suivante dans ton terminal :npm install expressC'est également le bon ce moment pour installer TypeScript (plus exactement le module TypeScript Execute qui simplifie l'exécution de TypeScript par rapport au compilateur TypeScript classique, voir https://tsx.is/) et les déclaration des types pour Express :
npm install --save-dev tsx @types/express - 4
Crée une application Express
Crée un fichier
index.tsdans ton dossierhello-express, et copie ce code Ă l'intĂ©rieur :typescriptimport express from "express"; const app = express(); app.get("/", (req, res) => { res.send("Hello World!"); }); const port = 3310; app.listen(port, () => { console.log(`Example app listening on port ${port}`); });Ce code crĂ©e un serveur Express qui Ă©coute les requĂȘtes sur le port
3310et rĂ©pond par un message"Hello World!"Ă toute requĂȘte de typeGETĂ la racine/du serveur web. - 5
Démarre le serveur
Avant de relire ce code ensemble, lance ton application avec la commande suivante dans ton terminal :
npx tsx --watch index.tsAttentionLe port
3310peut ĂȘtre dĂ©jĂ utilisĂ© par une autre application sur ta machine. Si c'est le cas, essaie une autre valeur (8080?) et sauvegarde ton fichier : l'application redĂ©marrera automatiquement.InfoL'option
--watchprovoque le redémarrage de l'application à chaque modification d'un fichier.Sans l'option
--watch, si tu modifies ton fichier, par exemple pour changer le message"Hello World!"aprĂšs avoir lancĂ© la commandenpx tsx index.ts, ton application ne redĂ©marrera pas automatiquement. Tu devras arrĂȘter le serveur avecCtrl + Cet le relancer Ă chaque fois que tu apporteras des modifications Ă ton fichier.Pour la culture, Avant que l'option
--watchsoit disponible dans node, une pratique courante dans un projet Express était d'installer le package nodemon pour redémarrer automatiquement le serveur à chaque modification du code.Maintenant tu peux ouvrir ton navigateur à l'adresse http://localhost:3310/ (change le 3310 dans l'URL si tu as utilisé un autre port) pour voir le message
"Hello World!"s'afficher.
Retour sur le code
Pour mieux comprendre comment fonctionne notre application Express, examinons le code, étape par étape.
Création de l'application Express
Tout d'abord, nous importons le module Express et initialisons une application. Cela crée notre application Express de base :
import express from "express";
const app = express();
Ce code doit ĂȘtre Ă©crit ainsi, sans raison particuliĂšre : c'est le fonctionnement d'Express qui nous l'impose.
Cette partie pourrait contenir beaucoup plus de lignes sur la configuration de l'application. Tu les découvriras au fur et à mesure de ton apprentissage. L'application "basique" nous suffit à ce stade.
Déclaration d'une route
Ensuite, nous dĂ©finissons une route Ă la racine / de notre application. Lorsqu'un utilisateur accĂšde Ă cette route via une requĂȘte HTTP get, notre application renvoie la rĂ©ponse "Hello World!" :
app.get("/", (req, res) => {
res.send("Hello World!");
});
Une autre façon d'écrire le code pour mieux faire ressortir les informations de la ligne app.get() :
const sayHello = (req, res) => {
res.send("Hello World!");
};
app.get("/", sayHello);
La méthode app.get() attend deux arguments :
- le chemin de la route (dans notre cas,
"/") ; - un callback qui spĂ©cifie ce que notre application doit faire quand une requĂȘte est envoyĂ©e au serveur Ă la racine
/avec la méthodeget.
Dis autrement, chaque fois que tu envoies une requĂȘte GET Ă la racine de ton serveur (c'est ce que tu fais en ouvrant l'adresse http://localhost:3310 dans ton navigateur), l'application express exĂ©cute les instructions de sayHello.
Tu l'as peut-ĂȘtre devinĂ© : les paramĂštres req et res du callback sayHello reprĂ©sentent la requĂȘte HTTP que tu vas recevoir et la rĂ©ponse HTTP que tu dois remplir. Ce sont des objets fournis automatiquement par Express (voir la documentation des objets Request et Response).
Dans cet exemple, avec l'instruction :
const sayHello = (req, res) => {
res.send("Hello World!");
};
app.get("/", sayHello);
Nous répondons avec la chaßne de caractÚres "Hello World!" en utilisant la méthode res.send().
Dans le contexte d'Express, la fonction callback sayHello est appellĂ©e un middleware. C'est un terme que tu verras en dĂ©tail plus tard dans ton parcours. Retiens pour l'instant que le mot "middleware" fait partie du vocabulaire d'Express : c'est une fonction de rappel (callback) qui prend en paramĂštres une requĂȘte et une rĂ©ponse HTTP. Dis en code :
// Ce callback avec des paramĂštres req et res est un middleware Express
(req, res) => {
/* ... */
}
Dans tes projets, tu répondras plus souvent avec un objet ou un tableau formaté en JSON. Ton code utiliserait alors la méthode res.json() à la place de res.send() :
const walterWhite = { sayMyName: "Heisenberg" };
const youKnowWhoIAm = (req, res) => {
res.json(walterWhite);
};
app.get("/who-are-you", youKnowWhoIAm);
Peu importe la logique de ta route ou le contenu de ta réponse, la déclaration d'une route suit toujours ce schéma : associer un callback à un verbe HTTP (GET, POST...) et un chemin d'URL. Prends le temps de déchiffrer cette syntaxe car tu vas la reproduire trÚs souvent :
const someCallback = (req, res) => {
// do something, and use res.send() or res.json()
};
app.get("/some-url-path", someCallback);
Ăcoute du port
DerniĂšre partie dans index.ts, nous spĂ©cifions le port sur lequel notre application Express Ă©coutera les requĂȘtes entrantes. Une fois que le serveur est en Ă©coute sur ce port, il peut recevoir et rĂ©pondre aux requĂȘtes HTTP pour les routes qui ont Ă©tĂ© dĂ©finies sur l'application :
const port = 3310;
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
Si tu veux te rendre compte de l'intĂ©rĂȘt d'Express pour crĂ©er une application serveur, tu peux regarder cette quĂȘte supplĂ©mentaire sur comment crĂ©er un serveur sans Express.
C'est un bonus pour ta culture, et tu n'en auras pas besoin pendant la formation.
- QuĂȘte 383 (hors archive)
Challenge
Crée un nouveau projet qui crée une application Express dans un fichier index.ts, et qui déclare une route GET /words.
Ta route doit répondre avec le tableau de données suivant au format JSON :
const data = ["lorem", "ipsum", "dolor", "sit", "amet"];
Poste le contenu de ton fichier index.ts en solution.
CritĂšres de validations
- [ ] Le code crée une application Express
- [ ] Le code déclare une route
GET /words - [ ] La route répond avec le tableau
dataau format JSON
import express from "express";
const app = express();
const data = ["lorem", "ipsum", "dolor", "sit", "amet"];
app.get("/words", (req, res) => {
res.json(data);
});
const port = 3310;
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
Ressources partagĂ©es sur cette quĂȘte
- Vidéo explicative pour installer Nodemon https://www.youtube.com/watch?v=Rxgyw21Iycw