À propos de ce cours
Objectifs de la leçon
- Comprendre ce qu'est un framework back-end.
- Comparer Node.js natif, Express, Fastify et NestJS sur un même exemple.
- Expliquer la relation entre NestJS, Express et Fastify.
Qu'est-ce qu'un framework back-end ?
Un framework est un cadre de travail : un ensemble d'outils et de conventions qui évite de réécrire les mêmes choses à chaque projet (gestion des routes, lecture du JSON, erreurs…). Pour mesurer ce qu'il apporte, écrivons le même serveur de quatre façons : il répond à GET /api/bonjour par { "message": "Bonjour" }.
1. Node.js sans framework
// serveur-natif.js — node serveur-natif.js
const http = require('http');
const serveur = http.createServer((req, res) => {
if (req.method === 'GET' && req.url === '/api/bonjour') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Bonjour' }));
} else {
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ erreur: 'Route introuvable' }));
}
});
serveur.listen(3000, () => console.log('http://localhost:3000'));
Tout est manuel : tester la méthode et l'URL, écrire les en-têtes, convertir en JSON. Avec 50 routes, ce code devient vite illisible.
2. Express
// npm install express
const express = require('express');
const app = express();
app.use(express.json()); // lit automatiquement le JSON reçu
app.get('/api/bonjour', (req, res) => {
res.json({ message: 'Bonjour' });
});
app.listen(3000);
Le routage et le JSON sont simplifiés. Express reste minimaliste: l'organisation du projet, la validation ou l'authentification sont à construire soi-même avec des bibliothèques externes (middlewares).
3. Fastify
// npm install fastify
const fastify = require('fastify')();
fastify.get('/api/bonjour', async () => {
return { message: 'Bonjour' }; // converti en JSON automatiquement
});
fastify.listen({ port: 3000 });
Fastify (2016) ressemble à Express mais a été conçu pour la performance: il traite davantage de requêtes par seconde et intègre la validation par schémas JSON. Comme Express, il n'impose pas d'architecture.
4. NestJS
// bonjour.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('api')
export class BonjourController {
@Get('bonjour')
direBonjour() {
return { message: 'Bonjour' };
}
}
Le code de la route est aussi court, mais il s'inscrit dans une architecture: le contrôleur est déclaré dans un module, il pourra recevoir un service, des validations, des guards… Et surtout, NestJS ne réinvente pas le serveur HTTP :
NestJS ajoute l'architecture ; Express ou Fastify gèrent le HTTP ; Node.js exécute le tout.
// main.ts — Express par défaut
const app = await NestFactory.create(AppModule);
// main.ts — avec Fastify (npm install @nestjs/platform-fastify)
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
Tableau comparatif
| Node.js natif | Express | Fastify | NestJS | |
|---|---|---|---|---|
| Type | Bibliothèque de base | Micro-framework | Micro-framework | Framework complet |
| Langage | JS | JS (TS possible) | JS (TS possible) | TypeScript |
| Architecture imposée | Non | Non | Non | Oui (modules) |
| Validation intégrée | Non | Non | Schémas JSON | Oui (pipes, DTO) |
| Injection de dépendances | Non | Non | Non | Oui |
| Prise en main | Longue à grande échelle | Très rapide | Rapide | Moyenne |
| Idéal pour | Comprendre les bases | Petits projets, prototypes | API très sollicitées | Projets moyens à grands, équipes |
D'autres frameworks Node.js existent (Koa, Hapi, AdonisJS…). Le choix dépend de la taille du projet, de l'équipe et des besoins de performance. Ce cours se concentre sur NestJS.
Activités
Activité 1 Exécuter les exemples
Pré-requis : Node.js installé (vérifiez avec node -v).
- Créez un dossier
comparatif-serveurs, ouvrez-le dans VS Code et lanceznpm init -y. - Créez
serveur-natif.jsavec le code de la partie 1 et lanceznode serveur-natif.js. Ouvrezhttp://localhost:3000/api/bonjour, puis une URL inexistante. - Arrêtez le serveur (Ctrl+C), installez Express (
npm install express) et testez la partie 2. - Comparez le nombre de lignes et le code de statut obtenu sur une URL inexistante dans les deux cas.
Voir le corrigé
La version native compte environ 12 lignes contre 6 pour Express. Pour une URL inexistante, la version native renvoie le JSON d'erreur que nous avons écrit ; Express renvoie automatiquement une page « Cannot GET … » avec le statut 404. Express fait donc à notre place une partie du travail.
Activité 2 Ajouter une route
Dans la version Express, ajoutez la route GET /api/heure qui renvoie { "heure": "..." } avec l'heure actuelle. Comment écririez-vous la même route dans le contrôleur NestJS de la partie 4 ?
Voir le corrigé
app.get('/api/heure', (req, res) => {
res.json({ heure: new Date().toLocaleTimeString('fr-FR') });
});
@Get('heure')
donnerHeure() {
return { heure: new Date().toLocaleTimeString('fr-FR') };
}
À retenir
- Node.js seul permet de créer un serveur, mais tout est manuel.
- Express et Fastify simplifient le routage et le JSON, sans imposer d'architecture.
- Fastify est orienté performance.
- NestJS ajoute l'architecture et s'exécute au-dessus d'Express (par défaut) ou de Fastify.