Archives Wild Code School
Express.js

đŸ‘©â€đŸ« Express 101 : part of your symphony

QuĂȘte 1 sur 1 · 3 images archivĂ©es

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. 1

    Valider les quĂȘtes suivantes

    QuĂȘtes liĂ©es
  2. 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, handleClick est un callback :

    javascript
    function handleClick() {
      alert("you clicked!");
    }
    
    button.addEventListener("click", handleClick);
    
  3. 3

    Identifier le callback dans cet extrait de code

    javascript
    function sayGoodBye() {
      console.log("Goodbye!");
    }
    
    greet("Alice", sayGoodBye);
    
    Voir la solution

    La fonction sayGoodBye est le callback. Dans cet exemple, la fonction sayGoodBye est exécutée par la fonction greet.

Sommaire

L'architecture client-serveur du web

Tu as peut-ĂȘtre dĂ©jĂ  vu un schĂ©ma de ce genre ?

architecture client serveur du web

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 :

react et express dans l'architecture client serveur du web

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 fetch qui 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 :

↗
https://developer.mozilla.org/fr/docs/Apprendre/Qu_est-ce_qu_un_serveur_web

Qu'est-ce qu'un serveur web ?

developer.mozilla.org

Zoom sur Express

Express est la piÚce du puzzle qui nous intéresse aujourd'hui :

focus sur express

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. 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. 2

    Initialise un module

    Créé un fichier package.json pour ton application :

    npm init -y
    

    Ajoute la propriété "type": "module" dans ton package.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 import et export Ă  la place des syntaxes CommonJS require et module.exports.

  3. 3

    Installe Express (et d'autres choses)

    Via npm en utilisant la commande suivante dans ton terminal :

    npm install express 
    

    C'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. 4

    Crée une application Express

    Crée un fichier index.ts dans ton dossier hello-express, et copie ce code à l'intérieur :

    typescript
    import 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 3310 et rĂ©pond par un message "Hello World!" Ă  toute requĂȘte de type GET Ă  la racine / du serveur web.

  5. 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.ts
    
    Attention

    Le port 3310 peut ĂȘ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.

    Info

    L'option --watch provoque 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 commande npx tsx index.ts, ton application ne redĂ©marrera pas automatiquement. Tu devras arrĂȘter le serveur avec Ctrl + C et le relancer Ă  chaque fois que tu apporteras des modifications Ă  ton fichier.

    Pour la culture, Avant que l'option --watch soit 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 :

typescript
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!" :

typescript
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() :

typescript
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Ă©thode get.

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 :

typescript
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().

Info

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 :

typescript
// 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() :

typescript
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 :

typescript
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 :

typescript
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ĂȘtes liĂ©es
  • 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 :

typescript
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 data au format JSON
typescript
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