Cours Node.js Complet 🟢
Les 12 chapitres essentiels — serveur HTTP, Express, API REST, bases de données et déploiement
🏠 Hub Programmation
⚡ JavaScript (prérequis)
🔷 TypeScript
▲ Next.js
☁️ AWS Cloud Practitioner
Introduction et installation
console.log('Bonjour depuis Node.js !')
// Exécuter
// node hello.js
// Variables d'environnement
console.log(process.env.NODE_ENV) // « development »
console.log(process.argv) // Arguments CLI
console.log(process.cwd()) // Répertoire courant
console.log(__dirname) // Dossier du fichier
console.log(__filename) // Chemin du fichier
Node.js = JavaScript côté serveur. Il exécute le moteur V8 de Chrome hors du navigateur. Créé par Ryan Dahl en 2009, Node.js est utilisé par Netflix, PayPal, LinkedIn, Uber et NASA. Son modèle non-bloquant (event loop) le rend ultra-performant pour les I/O.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install –lts
nvm use –lts
# Vérifier
node –version # v22.x
npm –version # 10.x
# Initialiser un projet
mkdir mon-api && cd mon-api
npm init -y # Crée package.json
# REPL interactif
node # Tapez du JS directement
| Caractéristique | Node.js |
|---|---|
| Moteur | V8 (Google Chrome) |
| Modèle | Single-threaded, event loop, non-bloquant |
| Package manager | npm (défaut), pnpm, yarn |
| Modules | ESM (import) recommandé, CommonJS (require) |
| Usage | API REST, microservices, temps réel, SSR, CLI, scripts |
| Force | I/O intensif (réseau, fichiers, DB) |
| Faiblesse | CPU intensif (calculs lourds) — utiliser Worker Threads |
Modules et npm
// math.js — exporter
export function add(a, b)
export function multiply(a, b)
export default function square(x)
// app.js — importer
import square, from './math.js'
add(2, 3) // 5
square(4) // 16
// Modules Node intégrés
import fs from 'node:fs/promises'
import path from 'node:path'
import from 'node:http'
npm install express # Dépendance de production
npm install -D nodemon # Dépendance de développement
# Raccourcis
npm i express # i = install
npm i -D vitest # -D = –save-dev
# Scripts (package.json)
# Exécuter un script
npm run dev
npm start # Raccourci (pas de « run » pour start/test)
npm test
Node 22+ a –watch intégré : plus besoin de nodemon pour le hot reload. node –watch src/index.js relance automatiquement à chaque changement de fichier.
Système de fichiers (fs)
import path from 'node:path'
// Lire un fichier
const content = await fs.readFile('data.txt', 'utf-8')
// Écrire un fichier
await fs.writeFile('output.txt', 'Contenu')
// Ajouter à un fichier
await fs.appendFile('log.txt', 'Nouvelle ligne\n')
// Lire un dossier
const files = await fs.readdir('./src')
// Vérifier l'existence
try catch
// Supprimer
await fs.unlink('old.txt')
await fs.rm('dossier', )
// JSON
const data = JSON.parse(await fs.readFile('data.json', 'utf-8'))
await fs.writeFile('data.json', JSON.stringify(data, null, 2))
// path — manipulation de chemins (cross-platform)
path.join('src', 'utils', 'file.js') // src/utils/file.js
path.resolve('./data') // Chemin absolu
path.extname('image.png') // .png
path.basename('/a/b/file.js') // file.js
Toujours utiliser fs/promises (async) et jamais fs.readFileSync (bloquant) dans un serveur. La version sync bloque l'event loop et empêche Node de traiter d'autres requêtes.
Async/Await et Promises
async function fetchUser(id)
// Gestion d'erreurs
try catch (err)
// Parallèle — Promise.all (toutes en même temps)
const [users, posts, comments] = await Promise.all([
fetchUsers(),
fetchPosts(),
fetchComments(),
])
// Promise.allSettled — ne fail pas si une échoue
const results = await Promise.allSettled([task1, task2, task3])
results.forEach(r => )
Serveur HTTP et Express
const server = createServer((req, res) => )
server.listen(3000, () => console.log('http://localhost:3000'))
import express from 'express'
const app = express()
// Middleware — parser le JSON
app.use(express.json())
// Routes
app.get('/', (req, res) => )
app.get('/users/:id', (req, res) => )
app.post('/users', (req, res) => )
// Middleware personnalisé
function logger(req, res, next)
app.use(logger)
// Démarrer
app.listen(3000, () => console.log('http://localhost:3000'))
Express est le framework Node.js le plus populaire (30M+ téléchargements/semaine). Minimaliste et extensible via des middleware. Alternatives modernes : Fastify (plus rapide), Hono (edge/serverless), Elysia (Bun).
API REST
const router = express.Router()
let users = [
,
,
]
// GET /users — Liste
router.get('/', (req, res) => )
// GET /users/:id — Détail
router.get('/:id', (req, res) => )
// POST /users — Créer
router.post('/', (req, res) => )
// PUT /users/:id — Remplacer
router.put('/:id', (req, res) => )
// DELETE /users/:id — Supprimer
router.delete('/:id', (req, res) => )
export default router
import userRouter from './routes/users.js'
app.use('/api/users', userRouter)
Bases de données
npm install prisma @prisma/client
npx prisma init
// prisma/schema.prisma
generator client
datasource db
model User
model Post
npx prisma migrate dev –name init
npx prisma studio # Interface web pour explorer la DB
import from '@prisma/client'
const prisma = new PrismaClient()
// CRUD
const users = await prisma.user.findMany()
const user = await prisma.user.findUnique()
const newUser = await prisma.user.create()
await prisma.user.update()
await prisma.user.delete()
// Relations (include)
const userWithPosts = await prisma.user.findUnique()
Prisma est l'ORM le plus populaire pour Node.js/TypeScript. Schéma déclaratif, migrations automatiques, typage auto, Prisma Studio. Alternatives : Drizzle ORM (plus léger, SQL-like), Sequelize (plus ancien), Mongoose (MongoDB).
Authentification
import jwt from 'jsonwebtoken'
import bcrypt from 'bcrypt'
const SECRET = process.env.JWT_SECRET
// Register — hasher le mot de passe
app.post('/register', async (req, res) => )
// Login — vérifier et générer le token
app.post('/login', async (req, res) => )
// Middleware d'authentification
function auth(req, res, next)
// Route protégée
app.get('/profile', auth, async (req, res) => )
Gestion d'erreurs
class AppError extends Error
// Route qui lève une erreur
app.get('/users/:id', async (req, res, next) => )
// Error handler global (APRÈS toutes les routes)
app.use((err, req, res, next) => )
import from 'zod'
const createUserSchema = z.object()
app.post('/users', (req, res) => )
Tests
// math.test.js
import from 'vitest'
import from './math.js'
describe('Math utils', () => )
// Test API avec supertest
// npm install -D supertest
import request from 'supertest'
import app from './app.js'
it('GET /api/users returns users', async () => )
Déploiement
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
JWT_SECRET=super_secret_key_123
PORT=3000
NODE_ENV=production
// Charger les variables
// Node 22+ : –env-file intégré
// node –env-file=.env src/index.js
// Utilisation
const port = process.env.PORT || 3000
const secret = process.env.JWT_SECRET
| Plateforme | Type | Idéal pour |
|---|---|---|
| Railway | PaaS | Déploiement simple (git push), DB intégrée |
| Render | PaaS | Free tier généreux, PostgreSQL |
| Fly.io | Conteneurs | Edge deployment, Docker |
| AWS EC2/ECS | IaaS/CaaS | Contrôle total, entreprise |
| Vercel | Serverless | API Routes (Next.js), edge functions |
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci –omit=dev
COPY . .
EXPOSE 3000
CMD [« node », « src/index.js »]
# .dockerignore
node_modules
.env
.git
Bonnes pratiques
├── src/
│ ├── index.js # Point d'entrée
│ ├── app.js # Config Express (séparé pour les tests)
│ ├── routes/
│ │ ├── users.js
│ │ └── posts.js
│ ├── middleware/
│ │ ├── auth.js
│ │ └── validate.js
│ ├── services/ # Logique métier
│ │ └── userService.js
│ ├── lib/
│ │ └── prisma.js # Instance Prisma singleton
│ └── utils/
│ └── errors.js
├── prisma/
│ └── schema.prisma
├── tests/
├── .env
├── .gitignore
├── package.json
└── Dockerfile
✅ À FAIRE
• ESM (import) + « type »: « module »
• fs/promises (async) partout
• Variables d'env (.env, jamais en dur)
• Validation input (Zod)
• Error handler global
• –watch en dev (Node 22+)
• Séparer app.js et index.js (tests)
• helmet + cors middleware
• TypeScript pour les gros projets
❌ À ÉVITER
• require() (CommonJS) — préférer ESM
• readFileSync dans un serveur
• Secrets en dur dans le code
• console.log en production (utiliser winston/pino)
• Ignorer les erreurs async
• npm install en prod (utiliser npm ci)
• Pas de validation d'input
• any partout en TypeScript
• Callback hell (utiliser async/await)
🏠 Hub Programmation
⚡ Cours JavaScript
🔷 Cours TypeScript
▲ Cours Next.js
☁️ AWS Cloud Practitioner
Cours Node.js Complet — Express, API REST et déploiement
Référence : nodejs.org | Express | Prisma
