Archives Wild Code School
Express.js

đŸ‘©â€đŸ« Express 102 : without Express

QuĂȘte 11 sur 12 · 1 image archivĂ©e

Objectifs

  • DĂ©couvrir le module node:http.
  • CrĂ©er une application serveur sans Express.

Pré-requis

  1. 1

    Valider la quĂȘte suivante

    QuĂȘtes liĂ©es
  2. 2

    Être à l'aise avec l'architecture client-serveur du web

    react et express dans l'architecture client serveur du web

  3. 3

    Identifier les 3 étapes pour créer une application serveur avec Express

    javascript
    // Création de l'application Express
    
    const express = require('express');
    const app = express();
    
    // Déclaration des routes
    
    const sayHello = (req, res) => {
      res.send("Hello World!");
    };
    
    app.get("/", sayHello);
    
    // Écoute du port
    
    const port = 3310;
    
    app.listen(port, () => {
      console.log(`Example app listening on port ${port}`);
    });
    

Introduction

Tu penses de plus en plus à ce qui se passe en coulisses lorsque tu navigues sur le Web ? Découvrons ensemble le fonctionnement des serveurs web et comment en créer un sans utiliser Express.

Lorsque tu navigues sur le web, chaque fois que tu accĂšdes Ă  une page web, ton navigateur envoie une requĂȘte Ă  un serveur, puis le serveur renvoie une rĂ©ponse avec le contenu de la page que tu souhaites voir. C'est ainsi que fonctionne l'architecture client-serveur du web.

Un serveur sans Express

Commence par créer un nouveau répertoire pour ton projet et accÚde-y dans ton terminal :

bash
mkdir hello-http
cd hello-http

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

bash
npm init

Crée un fichier index.js (vide pour l'instant) :

bash
touch index.js

Création de l'application serveur

Dans ton fichier index.js, importe le module node:http pour créer un serveur HTTP :

javascript
const http = require("node:http");
const app = http.createServer();

Nous importons le module node:http qui nous permet de créer un serveur HTTP. Ensuite, nous initialisons notre serveur avec la fonction createServer().

Cette étape est trÚs similaire à la création d'une application Express :

javascript
const express = require("express");
const app = express();

Rien de trÚs intéressant pour l'instant.

Déclaration des routes

Chaque fois que notre serveur reçoit une requĂȘte HTTP, il doit exĂ©cuter une fonction spĂ©cifique pour produire la rĂ©ponse. Cette fonction, appelĂ©e gestionnaire de requĂȘtes, est dĂ©finie Ă  l'aide de la mĂ©thode on() :

javascript
const handleRequest = (req, res) => {
  res.end("Hello World!");
};

app.on("request", handleRequest);

LĂ  encore, le code ressemble Ă  ce que tu as pu voir avec Express :

javascript
const sayHello = (req, res) => {
  res.send("Hello World!");
};

app.get("/", sayHello);

Nous reviendrons sur cette partie un peu plus tard.

Écoute du port

Le code est cette fois complĂštement identique dans les 2 cas :

javascript
const port = 3310;

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

Sauvegarde ton fichier index.js, et lance ton application avec la commande suivante dans ton terminal :

bash
node --watch index.js
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 relance la commande nodemon index.js.

Tu peux ensuite ouvrir ton navigateur Ă  l'adresse http://localhost:3310/ pour voir le message "Hello World!" s'afficher.

hidden
Afficher le code complet|||js|||Besoin d'aide ?|||0|||Masquer
// Création de l'application serveur

const http = require("node:http");
const app = http.createServer();

// Déclaration des routes

const handleRequest = (req, res) => {
  res.end("Hello World!");
};

app.on("request", handleRequest);

// Écoute du port

const port = 3310;

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

Plusieurs requĂȘtes, une seule rĂ©ponse

Actuellement, notre serveur renvoie la mĂȘme rĂ©ponse pour toutes les requĂȘtes. Tu peux t'en rendre compte en affichant l'URL demandĂ©e dans la console :

javascript
const handleRequest = (req, res) => {
  console.log(req.url);

  res.end("Hello World!");
};

AprÚs avoir sauvegardé ton fichier index.js, ouvre ces liens dans ton navigateur (en adaptant le port au besoin) :

Si le message dans ta console affiche des URLs diffĂ©rentes pour chaque requĂȘte, la rĂ©ponse est toujours la mĂȘme : Hello World!.

Adapter la rĂ©ponse Ă  la requĂȘte

Lorsque nous crĂ©ons un serveur HTTP avec le module node:http, nous avons la flexibilitĂ© de dĂ©finir notre propre logique pour rĂ©pondre aux diffĂ©rentes requĂȘtes. Dans l'exemple ci-dessous, nous utilisons une structure conditionnelle pour router les requĂȘtes vers diffĂ©rentes rĂ©ponses en fonction de l'URL demandĂ©e :

javascript
const http = require("node:http");
const app = http.createServer();

const handleRequest = (req, res) => {
  console.log(req.url);

  if (req.url === "/") {
    res.end("Hello World!");
  } else if (req.url === "/about") {
    res.end("About World!");
  } else {
    res.end("Not Found");
  }
};

app.on("request", handleRequest);

const port = 3310;

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

Dans cet exemple, chaque requĂȘte est dirigĂ©e vers la fonction handleRequest, qui vĂ©rifie l'URL de la requĂȘte et envoie une rĂ©ponse appropriĂ©e : plus l'application comptera de routes, plus cette fonction va devenir complexe.

En revanche, avec Express, la gestion des routes est simplifiĂ©e Ă  l'aide de mĂ©thodes spĂ©cifiques comme app.get(), app.post(), etc. pour dĂ©clarer les routes et spĂ©cifier les gestionnaires de requĂȘte associĂ©s. Voici comment l'exemple prĂ©cĂ©dent serait implĂ©mentĂ© avec Express :

javascript
const express = require("express");
const app = express();

// Gestionnaire de requĂȘte pour la route "/"
app.get("/", (req, res) => {
  res.send("Hello World!");
});

// Gestionnaire de requĂȘte pour la route "/about"
app.get("/about", (req, res) => {
  res.send("About World!");
});

// Gestionnaire de requĂȘte pour toutes les autres routes
app.use((req, res) => {
  res.sendStatus(404);
});

const port = 3310;

app.listen(port, () => {
  console.log(`Server is listening on port ${port}`);
});

Avec Express, nous pouvons dĂ©finir des gestionnaires de requĂȘte spĂ©cifiques pour chaque route. Cette approche simplifie la gestion des routes et rend le code plus lisible et modulaire.

Félicitations !

Tu as maintenant créé un serveur web fonctionnel sans utiliser Express. Continue d'explorer les possibilités offertes par les modules node, comme node:fs pour manipuler les fichiers par exemple, et amuse-toi à expérimenter avec la création d'applications console.

Ressources partagĂ©es sur cette quĂȘte