Archives Wild Code School
Express.js

Express 01 - đŸ‘šđŸ»â€đŸš€ DĂ©couverte d'Express

QuĂȘte 1 sur 12 · 7 images archivĂ©es

⚠ Avant de commencer cette quĂȘte, nous te conseillons de regarder celle-ci :
QuĂȘtes liĂ©es

Introduction

Précédemment, nous avons vu comment créer un serveur en utilisant Node.js et le module http.

Cependant, crĂ©er un serveur en utilisant le module "http" peut devenir compliquĂ©. Dans cette quĂȘte, nous allons dĂ©couvrir comment crĂ©er un serveur en utilisant Express.

Express est un framework pour Node.js qui nous donne accÚs à des outils puissants et simples que nous pouvons utiliser pour créer et configurer notre serveur rapidement.

En suivant les quĂȘtes de ce module, tu vas construire pas Ă  pas le prototype d'une application serveur. Au final, ton application pourra gĂ©rer des requĂȘtes liĂ©es Ă  une base de donnĂ©es de films et d'utilisateurs. Commençons ! 🚀

đŸ€“ Dans cette quĂȘte, tu vas apprendre comment :

✅ Installer et configurer Express ✅ IntĂ©grer Express dans une application NodeJS ✅ CrĂ©er ta premiĂšre sĂ©rie de routes en utilisant Express

⚙ Installation

Étape 1 : Commence par ouvrir ton terminal et par crĂ©er un rĂ©pertoire :

bash
mkdir express-app

Étape 2 : Navigue dans ce rĂ©pertoire :

bash
cd express-app

Étape 3 : Initialise ton projet :

bash
npm init -y

đŸ‘ŒđŸ» On peut utiliser le flag -y pour utiliser les valeurs par dĂ©faut pour notre package.json

Étape 4 : Maintenant que le projet est initialisĂ©, installe Express :

bash
npm install express

💯 Bien jouĂ© ! Tu peux maintenant utiliser Express!

đŸ‘ŒđŸ»N'hĂ©site pas Ă  regarder la documentation d'express et Ă  la sauvegarder dans tes favoris au cas oĂč tu oublierais comment installer express.

↗
Documentation d'express

Installation d'express

expressjs.com

đŸ—ïž CrĂ©er ton application express

Étape 1 : CrĂ©e un fichier javascript pour contenir tout le code de ton application. Appelons-le index.js. Dans ce fichier, importe express :

javascript
const express = require('express');

Étape 2 : CrĂ©e une application en appelant le module express. La convention est de l'appeler app :

javascript
const app = express();

âžĄïž Maintenant, nous avons accĂšs Ă  de nombreuses mĂ©thodes express en utilisant app.METHOD (ex : app.get(), app.post(), etc...)

đŸ‘ŒđŸ» Tu peux trouver la liste des mĂ©thodes disponibles sur la documentation d'express.

Étape 3 : CrĂ©e une constante pour stocker le numĂ©ro du port sur lequel ton serveur sera disponible. Pour cet exemple, utilisons le port 5000.

javascript
const port = 5000;

Étape 4 : Maintenant, tu dois Ă©couter les connexions entrantes. Pour cela, utilise app.listen.

javascript
app
  .listen(port, () => {
    console.info(`Server is listening on port ${port}`);
  })
  .on("error", (err) => {
    console.error("Error:", err.message);
  });

Étape 5 : Utilise ton terminal (assure-toi que tu es dans le bon rĂ©pertoire) et exĂ©cute node index.js

âžĄïž Tu devrais voir Server is listening on port 5000.

Étape 6 : Maintenant, va dans ton navigateur et accùde à localhost:5000 ; Tu devrais voir "Cannot GET /".

Cannot GET /

âžĄïž Cette erreur est normale, nous avons créé le serveur, mais nous n'avons pas encore de routes. Tu vas devoir ajouter plus de code dans ton application et recharger le serveur (ce qui signifie l'arrĂȘter en utilisant Ctrl+C et exĂ©cuter Ă  nouveau la commande node).

⚙ Installer Nodemon

Recharger ton serveur tout le temps peut ĂȘtre assez ennuyeux, pour Ă©viter cela, tu peux utiliser un paquet Node appelĂ© Nodemon.

Nodemon écoutera les changements dans tes fichiers et redémarrera automatiquement le serveur.

nodemon

Étape 1 : Installer nodemon en utilisant npm.

bash
npm install nodemon --save-dev

â˜đŸ» Nous devons installer nodemon dans les dĂ©pendances de dĂ©veloppement, car nous n'utiliserons nodemon que lorsque nous dĂ©velopperons notre projet. Nous ne voulons pas que ce paquet soit installĂ© et utilisĂ© en production.

Étape 2: Adapte ton package.json, en modifiant "main" et "scripts" :

json
"main": "index.js",
"scripts": {
  "start": "node index.js",
  "dev": "nodemon index.js",
  "test": "echo \"Error: no test specified\" && exit 1"
},

C'est une pratique courante de réserver le script start pour la prodution, et d'avoir un script dev pour le développement : ici, le script dev exécutera nodemon au lieu de node.

Étape 3: Utilise npm run dev pour dĂ©marrer le serveur.

npm run dev

đŸ›Łïž CrĂ©er une route

Le routage consiste Ă  dĂ©terminer comment une application rĂ©pond Ă  une requĂȘte du client vers une route de l'application. On parle Ă©galement de "point d'entrĂ©e", ou endpoint en anglais. Un point d'entrĂ©e est un chemin d'URL (/, /about, contact, etc.) associĂ© une mĂ©thode de requĂȘte HTTP spĂ©cifique (GET, POST, etc.).

La définition des routes devrait ressembler à ceci :

javascript
app.METHOD(PATH, HANDLER)
  • app est une instance d'Express.

  • METHOD est une mĂ©thode de requĂȘte HTTP. (GET, POST, PUT, DELETE)

  • PATH est un chemin sur le serveur.

  • HANDLER est la fonction exĂ©cutĂ©e lorsque le chemin est reconnu

Créons une route GET !

Quand quelqu'un fait une requĂȘte GET vers la racine de notre serveur, nous voulons envoyer comme rĂ©ponse "Welcome to Express". Donc en partant de app.METHOD(PATH, HANDLER) :

  • La METHOD est get :
javascript
app.get(PATH, HANDLER);
  • Le PATH est / :
javascript
app.get("/", HANDLER)
  • Le HANDLER doit envoyer "Welcome to Express" :
javascript
app.get("/", (req, res) => {
  res.send("Welcome to Express");
});

Voici le code que tu devrais avoir :

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

const port = 5000;

app.get("/", (req, res) => {
  res.send("Welcome to Express");
});

app
  .listen(port, () => {
    console.info(`Server is listening on port ${port}`);
  })
  .on("error", (err) => {
    console.error("Error:", err.message);
  });

Maintenant, va sur localhost:5000 : tu dois voir "Welcome to Express" s'afficher.

đŸ€“ Allons plus loin:

image

⚙ HANDLER

Le HANDLER est une fonction exĂ©cutĂ©e lorsque la route est dĂ©clenchĂ©e par une requĂȘte. Tu verras souvent dans la documentation ou les forums cette fonction "fusionnĂ©e" avec la dĂ©claration de la route :

javascript
app.get('/search', (req, res) => {});

Jusqu'à ce que tu sois vraiment à l'aise avec Express, il est important de séparer dans ton esprit la déclaration de la route et le HANDLER. C'est pourquoi nous préférerons dans ce module écrire :

javascript
const handler = (req, res) => {};

app.get("/search", handler);

Le HANDLER prend 2 paramÚtres, correspondant à 2 objets HTTP définis dans Express :

  • un objet de type Request (par convention, le paramĂštre est appelĂ© request ou plus souvent req)

  • un objet de type Response (par convention, le paramĂštre est appelĂ© response ou plus souvent res)

Chacun de ces objets a de nombreuses méthodes et propriétés.

ex: response.send("Welcome to Express");

❓Request

L'objet de requĂȘte reprĂ©sente la requĂȘte HTTP. Il contient des informations telles que :

  • l'en-tĂȘte HTTP,

  • Le corps de la requĂȘte (ce qui est envoyĂ© avec la requĂȘte),

  • DonnĂ©es de formulaire,

  • ParamĂštres de l'URL et query string, ...

Tu peux vĂ©rifier toutes les mĂ©thodes et propriĂ©tĂ©s disponibles pour l'objet de requĂȘte sur la documentation d'Express :

↗
Express - API Reference - Express.js

Express - API Reference - Express.js

expressjs.com

req.params

Tu peux capturer certaines valeurs de l'URL en utilisant req.params. Imaginons que tu veuilles accéder à un profil d'utilisateur spécifique, en utilisant son nom comme référence.

Tu peux marquer la présence d'un paramÚtre dans le path de la route : on accédera à la valeur de ce paramÚtre en utilisant req.params.

Faisons cela ! Créons une nouvelle route :

javascript
const welcomeName = (req, res) => {
  res.send(`Welcome ${req.params.name}`);
};

app.get("/users/:name", welcomeName);

La partie :name est le marqueur d'un paramÚtre : : est le préfixe qui marque un paramÚtre, name est ici le nom du paramÚtre (le nom d'un utilisateur dans notre exemple). Maintenant, navigue vers localhost:5000/users/Bob. Tu devrais voir "Welcome Bob".

Change le nom Ă  la fin de l'url et tu devrais voir un nouveau nom quand la page se rafraĂźchit.

hidden
Voir le code complet|||javascript||||||0|||Cacher le code complet
const express = require("express");
const app = express();

const port = 5000;

const welcome = (req, res) => {
  res.send("Welcome to Express");
};

app.get("/", welcome);

const welcomeName = (req, res) => {
  res.send(`Welcome ${req.params.name}`);
};

app.get("/users/:name", welcomeName);

app
  .listen(port, () => {
    console.info(`Server is listening on port ${port}`);
  })
  .on("error", (err) => {
    console.error("Error:", err.message);
  });

❗Response

L'objet response reprĂ©sente la rĂ©ponse HTTP que le serveur envoie au client. Il peut contenir des donnĂ©es, des messages (validation, erreur), ou simplement un Ă©tat correspondant Ă  l'Ă©tat de la requĂȘte traitĂ©e par le serveur. 

Tu peux vĂ©rifier toutes les mĂ©thodes et propriĂ©tĂ©s disponibles pour l'objet de requĂȘte sur la documentation d'Express :

http://expressjs.com/fr/4x/api.html#res

Voici quelques méthodes utiles de l'objet Response :

  • res.send permet d'envoyer des donnĂ©es (String, Object, Array, Buffer)
js
(req, res) => {
  res.send(‘Validated’);
};
  • res.status pour joindre un message de statut dans la rĂ©ponse. GĂ©nĂ©ralement combinĂ© avec le "send"
js
(req, res) => {
  res.status(404).send(‘Cannot find /foo’);
};
  • res.sendStatus pour n'envoyer que le statut de la requĂȘte
js
(req, res) => {
  res.sendStatus(200);
};
  • res.json pour envoyer un objet au format JSON
js
(req, res) => {
  res.json({ result: ‘10 items found’ });
};
  • res.end permet de terminer la requĂȘte sans envoyer de donnĂ©es particuliĂšres.
javascript
(req, res) => {
  res.end(); // or res.status(404).end();
};

Habituellement, quand nous créons un serveur, nous utilisons une réponse formatée en JSON. Imaginons que l'utilisateur veuille accéder à un catalogue de cocktails.

En accédant à /api/cocktails le serveur lui renverra un JSON avec tous les cocktails disponibles.

javascript
const cocktails = [
  {
    id: 1,
    name: "Margarita",
  },
  {
    id: 2,
    name: "Mojito",
  },
  {
    id: 3,
    name: "Cuba Libre",
  },
];

const getCocktails = (req, res) => {
  res.status(200).json(cocktails);
};

app.get("/api/cocktails", getCocktails);

AccÚde à localhost:5000/api/cocktails et tu devrais voir la liste des cocktails au format JSON ! 

GET cocktails

Info

Fan de Chrome

Tu peux utiliser l'extension jsonformatter sur chrome pour rendre le json plus lisible ! Tu peux trouver l'extension ici.

📚 Voici une liste de ressources que tu devrais mettre en favoris :

↗
Response API

Documentation on the Response object

expressjs.com
↗
Request API

Documentation on the Request object

expressjs.com
↗
Building RESTful APIs with Node and Express

Tutorial on Node and Express

youtube.com

đŸ’Ș Challenge

Créer des routes express

Pour ce challenge, pars de cette app :

javascript
const express = require("express");

const app = express();

const port = 5000;

const movies = [
  {
    id: 1,
    title: "Citizen Kane",
    director: "Orson Wells",
    year: "1941",
    color: false,
    duration: 120,
  },
  {
    id: 2,
    title: "The Godfather",
    director: "Francis Ford Coppola",
    year: "1972",
    color: true,
    duration: 180,
  },
  {
    id: 3,
    title: "Pulp Fiction",
    director: "Quentin Tarantino",
    year: "1994",
    color: true,
    duration: 180,
  },
];

app
  .listen(port, () => {
    console.info(`Server is listening on port ${port}`);
  })
  .on("error", (err) => {
    console.error("Error:", err.message);
  });

Ton défi est de :

  • CrĂ©er une route GET /, qui doit renvoyer "Welcome to my favourite movie list"
  • CrĂ©er une route GET /api/movies, cette route doit renvoyer un Ă©tat 200 et une liste de films au format json (utilise le tableau movies dĂ©clarĂ© dans l'app ;) )
  • CrĂ©er une route GET /api/movies/:id qui ne retournera que le film correspondant Ă  l'id dĂ©fini dans l'url (tu peux parcourir le tableau movies avec une boucle for, ou utiliser la mĂ©thode .find())
    • S'il y a un film qui correspond aux paramĂštres, renvoie une rĂ©ponse avec un statut 200 et le film correspondant comme objet json
    • Sinon, renvoie un statut 404 avec un message "Not Found".

Poste le code de ton fichier index.js en solution.

🧐 Critùres de validation

  • [ ] Le serveur fonctionne
  • [ ] L'url / affiche "Welcome to my favourite movie list"
  • [ ] L'url /api/movies affiche la liste des films au format json
  • [ ] L'url /api/movies/2 affiche le film The Godfather au format json
  • [ ] L'url /api/movies/5 affiche Not found

==$==

Ce que tu devrais avoir dans :

javascript
const express = require("express");

const app = express();

const port = 5000;

const welcome = (req, res) => {
  res.send("Welcome to my favourite movie list");
};

app.get("/", welcome);

const movies = [
  {
    id: 1,
    title: "Citizen Kane",
    director: "Orson Wells",
    year: "1941",
    color: false,
    duration: 120,
  },
  {
    id: 2,
    title: "The Godfather",
    director: "Francis Ford Coppola",
    year: "1972",
    color: true,
    duration: 180,
  },
  {
    id: 3,
    title: "Pulp Fiction",
    director: "Quentin Tarantino",
    year: "1994",
    color: true,
    duration: 180,
  },
];

const getMovies = (req, res) => {
  res.json(movies);
};

app.get("/api/movies", getMovies);

const getMovieById = (req, res) => {
  const id = parseInt(req.params.id);

  const movie = movies.find((movie) => movie.id === id);

  if (movie != null) {
    res.json(movie);
  } else {
    res.status(404).send("Not Found");
  }
};

app.get("/api/movies/:id", getMovieById);

app
  .listen(port, () => {
    console.info(`Server is listening on port ${port}`);
  })
  .on("error", (err) => {
    console.error("Error:", err.message);
  });

Ressources partagĂ©es sur cette quĂȘte