Aller au contenu
NestJS OpenPartie 2, section c
Changer de langue : lire en anglais

c · Express, un vrai framework

  • Environ 45 minutes
  • 4 exercices

Express est un framework HTTP minimaliste : il ne fait rien que le module http ne pouvait déjà faire, mais il te débarrasse du routage à la main, du parsing d’URL et de la lecture du corps morceau par morceau.

Fenêtre de terminal
npm install express
serveur.js
import express from 'express';
const app = express();
const villages = [
{ id: '1', nom: 'Lune Rousse' },
{ id: '2', nom: 'Bois-Dormant' },
];
app.get('/api/villages', (req, res) => {
res.json(villages);
});
app.listen(3000, () => {
console.log('Serveur démarré sur http://localhost:3000');
});

Compare à la section a : plus de req.method === 'GET' && req.url === '...', plus de JSON.stringify ni d’en-tête à poser à la main — app.get(chemin, gestionnaire) et res.json(valeur) font tout ça.

Un segment précédé de : dans le chemin devient accessible dans req.params :

app.get('/api/villages/:id', (req, res) => {
const village = villages.find((v) => v.id === req.params.id);
if (!village) {
res.status(404).json({ message: 'Village introuvable' });
return;
}
res.json(village);
});

La chaîne de requête (?tri=nom), elle, arrive dans req.query :

app.get('/api/villages', (req, res) => {
const resultat = req.query.tri === 'nom' ? [...villages].sort((a, b) => a.nom.localeCompare(b.nom)) : villages;
res.json(resultat);
});

Par défaut, Express ne lit pas le corps des requêtes — il faut le lui demander, avec le middleware express.json() (les middlewares font l’objet de la section d).

app.use(express.json());
app.post('/api/villages', (req, res) => {
const village = req.body; // déjà un objet JavaScript, déjà parsé
villages.push(village);
res.status(201).json(village);
});

Sans express.json(), req.body vaudrait undefined : plus besoin d’accumuler les morceaux de la requête toi-même comme en section a, mais il faut activer ce comportement explicitement.

Exercices 2.8 à 2.11

Installe Express dans le projet de la section b. Écris GET /api/villages, qui renvoie le tableau en JSON avec res.json().

Ajoute GET /api/villages/:id. Si aucun village ne correspond, réponds 404 avec res.status(404).json({ message: 'Village introuvable' }).

Ajoute app.use(express.json()), puis POST /api/villages : ajoute req.body au tableau en mémoire, et renvoie-le avec un statut 201.

Ajoute le support de GET /api/villages?nom=Lune sur la route existante : si nom est fourni dans req.query, ne renvoie que les villages dont le nom le contient (insensible à la casse).