Cours Détaillé Node.
js - Technologies Backend
1. Introduction
• Node.js est un environnement d'exécution JavaScript côté serveur.
• Permet de créer des applications backend très performantes, à base d'événements, non bloquantes
(asynchrones).
2. Express.js
• Express.js est un framework minimaliste pour Node.js.
• Simplifie la création de serveurs HTTP, de routes, de middlewares et d'API REST.
Installation de base :
npm install express
Exemple de serveur :
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello World'));
app.listen(3000, () => console.log('Serveur écoute sur 3000'));
3. Middlewares Express
• Fonctions qui ont accès à req , res et next()
• S’exécutent entre la réception de la requête et la réponse finale
Types :
• express.json() : Parse le corps JSON
• express.urlencoded() : Formulaire HTML
• express.static('public') : Fichiers statiques
4. Routage
• Utilise app.get() , app.post() , etc.
1
• Utilisation de express.Router() pour modulariser
Exemple avec paramètres et routes complexes :
app.get('/user/:id', (req, res) => {
res.send(`ID utilisateur: ${req.params.id}`);
});
Exemple avec route joker :
app.get('/esprit/n?od+js*_4TWIN', (req, res) => {
res.send('Route joker matchée');
});
5. CRUD avec JSON (sans base de données)
const express = require('express');
const fs = require('fs');
const app = express();
app.use(express.json());
const FILE = './data.json';
function readData() {
return JSON.parse(fs.readFileSync(FILE));
}
function writeData(data) {
fs.writeFileSync(FILE, JSON.stringify(data, null, 2));
}
app.get('/products', (req, res) => {
res.json(readData());
});
app.get('/products/:id', (req, res) => {
const products = readData();
const product = products.find(p => p.id == req.params.id);
if (product) res.json(product);
else res.status(404).send('Not found');
});
app.post('/products', (req, res) => {
const products = readData();
2
products.push(req.body);
writeData(products);
res.status(201).json(req.body);
});
app.put('/products/:id', (req, res) => {
let products = readData();
const index = products.findIndex(p => p.id == req.params.id);
if (index !== -1) {
products[index] = { ...products[index], ...req.body };
writeData(products);
res.json(products[index]);
} else res.status(404).send('Not found');
});
app.delete('/products/:id', (req, res) => {
let products = readData();
const filtered = products.filter(p => p.id != req.params.id);
writeData(filtered);
res.status(204).send();
});
app.listen(3000, () => console.log('Server running on port 3000'));
6. MongoDB avec Mongoose
Installation :
npm install mongoose
Connexion et modèle :
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/formations');
const formationSchema = new mongoose.Schema({
titre: String,
duree: Number,
prix: Number
});
const Formation = mongoose.model('Formation', formationSchema);
3
Application avec Express et EJS :
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const app = express();
mongoose.connect('mongodb://localhost:27017/formations');
const Formation = require('./model/Formation');
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({ extended: false }));
app.get('/', async (req, res) => {
const formations = await Formation.find();
res.render('index', { formations });
});
app.post('/add', async (req, res) => {
await Formation.create(req.body);
res.redirect('/');
});
app.post('/delete/:id', async (req, res) => {
await Formation.findByIdAndDelete(req.params.id);
res.redirect('/');
});
app.listen(3000, () => console.log('Serveur démarré sur le port 3000'));
Créer un dossier views contenant le fichier index.ejs décrit dans la section EJS.
7. Moteur de vues EJS
Exemple de fichier index.ejs :
<!DOCTYPE html>
<html>
<head>
<title>Liste des formations</title>
</head>
<body>
<h1>Formations</h1>
<ul>
<% formations.forEach(formation => { %>
4
<li>
<%= formation.titre %> - <%= formation.duree %>h - <%= formation.prix
%>€
<form method="POST" action="/delete/<%= formation._id %>">
<button type="submit">Supprimer</button>
</form>
</li>
<% }) %>
</ul>
<form action="/add" method="POST">
<input type="text" name="titre" placeholder="Titre">
<input type="number" name="duree" placeholder="Durée">
<input type="number" name="prix" placeholder="Prix">
<button type="submit">Ajouter</button>
</form>
</body>
</html>
8. Tests avec Mocha, Chai, Supertest
// Voir section précédente pour test API CRUD
Commande d’exécution :
npm test
Script dans package.json :
"scripts": {
"test": "mocha"
}
9. Microservices
Chaque service a son propre serveur Express.
users-service.js
const express = require('express');
const axios = require('axios');
const app = express();
5
app.get('/users', (req, res) => {
res.json([{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]);
});
const PORT = 3002;
app.listen(PORT, async () => {
console.log(`Users Service sur le port ${PORT}`);
await axios.post('http://discovery:3001/register', {
name: 'users',
url: `http://users:3002`
});
});
books-service.js (même principe)
app.get('/books', (req, res) => {
res.json([{ id: 1, title: 'Node.js Basics' }]);
});
10. Discovery Service
discovery-server.js
const express = require('express');
const app = express();
app.use(express.json());
const services = [];
app.post('/register', (req, res) => {
const { name, url } = req.body;
services.push({ name, url });
res.send(`Service ${name} enregistré.`);
});
app.get('/services/:name', (req, res) => {
const service = services.find(s => s.name === req.params.name);
if (service) res.json(service);
else res.status(404).send('Non trouvé');
});
app.listen(3001, () => console.log('Discovery à l’écoute sur 3001'));
6
11. API Gateway
api-gateway.js
const express = require('express');
const axios = require('axios');
const app = express();
app.get('/api/users', async (req, res) => {
const { data } = await axios.get('http://localhost:3001/services/users');
const response = await axios.get(`${data.url}/users`);
res.json(response.data);
});
app.get('/api/books', async (req, res) => {
const { data } = await axios.get('http://localhost:3001/services/books');
const response = await axios.get(`${data.url}/books`);
res.json(response.data);
});
app.listen(3000, () => console.log('Gateway sur 3000'));
12. Docker
Exemple de Dockerfile pour un service Node.js
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]
Exemple docker-compose.yml pour les services
version: '3'
services:
discovery:
build: ./discovery-service
ports:
- "3001:3001"
7
users:
build: ./users-service
ports:
- "3002:3002"
depends_on:
- discovery
books:
build: ./books-service
ports:
- "3003:3003"
depends_on:
- discovery
gateway:
build: ./api-gateway
ports:
- "3000:3000"
depends_on:
- discovery
- users
- books
Commandes Docker utiles :
docker-compose build
docker-compose up
docker-compose up -d
docker-compose down
docker-compose logs gateway
docker exec -it nom_du_service sh
13. Bonus : Bonnes pratiques
• Structure MVC : séparer les fichiers en models , views , controllers , routes
• Utiliser dotenv pour gérer les variables d'environnement ( .env )
npm install dotenv
require('dotenv').config();
• Utiliser `` pour le développement :
8
npm install --save-dev nodemon
Dans package.json :
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
• Valider les entrées utilisateur : avec express-validator ou joi
• Gérer les erreurs globalement :
app.use((err, req, res, next) => {
res.status(err.status || 500).json({ message: err.message });
});
Fin du cours Node.js complet
Ce cours résume tous les documents et exercices : Express.js, MongoDB, EJS, CRUD JSON, Docker,
microservices, Gateway, Discovery, tests Mocha/Chai, architecture scalable, avec toutes les corrections de
code incluses.